python - script - Cómo encontrar hijos de nodos usando Beautiful Soup
python script web scraping (6)
Quiero obtener todas las etiquetas <a>
que son hijos de <li>
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
</li>
</div>
Sé cómo encontrar elementos con clases particulares como esta
soup.find("li", { "class" : "test" })
Pero no sé cómo encontrar todos los que son hijos de <li class=test>
pero no otros
como quiero seleccionar
<a> link1 </a>
"¿Cómo encontrar todos los que son hijos de <li class=test>
pero no otros?"
Dado el HTML a continuación (agregué otro <a>
para mostrar la diferencia entre select
y select_one
):
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
<a>link3</a>
</li>
</div>
La solución es usar un combinador infantil ( >
) que se coloca entre dos selectores de CSS:
>>> soup.select(''li.test > a'')
[<a>link1</a>, <a>link3</a>]
En caso de que quiera encontrar solo el primer hijo:
>>> soup.select_one(''li.test > a'')
<a>link1</a>
Hay una sección superpequeña en los DOC que muestra cómo encontrar / encontrar_todos los niños directos .
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument
en tu caso:
soup.find("li", { "class" : "test" },recursive=False)
soup.find_all("li", { "class" : "test" },recursive=False)
Otro método más: crear una función de filtro que devuelva True
para todas las etiquetas deseadas:
def my_filter(tag):
return (tag.name == ''a'' and
tag.parent.name == ''li'' and
''test'' in tag.parent[''class''])
Luego simplemente llame a find_all
con el argumento:
for a in soup(my_filter): # or soup.find_all(my_filter)
print a
Prueba esto
li = soup.find(''li'', {''class'': ''text''})
children = li.findChildren()
for child in children:
print child
Quizás quieras hacer
soup.find("li", { "class" : "test" }).find(''a'')
prueba esto:
li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li
otros recordatorios:
El método de búsqueda solo obtiene el primer elemento hijo que se produce. El método find_all obtiene todos los elementos descendientes y se almacenan en una lista.