tutorial script scraping scrap page from examples python html beautifulsoup

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>



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.