from examples example beautifulsoup4 python screen-scraping beautifulsoup

python - examples - BeautifulSoup: ¿Cómo extraigo todas las<li> s de una lista de<ul> s que contiene algunas<ul> s anidadas?



from bs4 import beautifulsoup (2)

Mi código fuente se ve como:

<h3>Header3 (Start here)</h3> <ul> <li>List items</li> <li>Etc...</li> </ul> <h3>Header 3</h3> <ul> <li>List items</li> <ul> <li>Nested list items</li> <li>Nested list items</li></ul> <li>List items</li> </ul> <h2>Header 2 (end here)</h2>

Me gustaría todas las etiquetas "li" después de la primera etiqueta "h3" y detenerme en la siguiente etiqueta "h2", incluidas todas las etiquetas li anidadas.

firstH3 = soup.find (''h3'')

Encuentra correctamente el lugar donde me gustaría empezar.

firstH3 = soup.find(''h3'') # Start here uls = [] for nextSibling in firstH3.findNextSiblings(): if nextSibling.name == ''h2'': break if nextSibling.name == ''ul'': uls.append(nextSibling)

me da una lista de los UL, cada uno con los contenidos de LI que necesito.

EXTRACTO DE LA LISTA "uls":

<ul> ... <li><i><a href="/wiki/Agent_Cody_Banks" title="Agent Cody Banks">Agent Cody Banks</a></i> (2003)</li> <li><i><a href="/wiki/Agent_Cody_Banks_2:_Destination_London" title="Agent Cody Banks 2: Destination London">Agent Cody Banks 2: Destination London</a></i> (2004)</li> <li>Air Bud series: <ul> <li><i><a href="/wiki/Air_Bud:_World_Pup" title="Air Bud: World Pup">Air Bud: World Pup</a></i> (2000)</li> <li><i><a href="/wiki/Air_Bud:_Seventh_Inning_Fetch" title="Air Bud: Seventh Inning Fetch">Air Bud: Seventh Inning Fetch</a></i> (2002)</li> <li><i><a href="/wiki/Air_Bud:_Spikes_Back" title="Air Bud: Spikes Back">Air Bud: Spikes Back</a></i> (2003)</li> <li><i><a href="/wiki/Air_Buddies" title="Air Buddies">Air Buddies</a></i> (2006)</li> </ul> </li> <li><i><a href="/wiki/Akeelah_and_the_Bee" title="Akeelah and the Bee">Akeelah and the Bee</a></i> (2006)</li> ... </ul>

Pero no estoy seguro de a dónde ir desde aquí. Soy un programador novato que intenta saltar a Python creando un guión que raspa http://en.wikipedia.org/wiki/2000s_in_film y extrae una lista de "Título de película (Año)".

Actualizar:

Código final:

lis = [] for ul in uls: for li in ul.findAll(''li''): if li.find(''ul''): break lis.append(li) for li in lis: print li.text.encode("utf-8")

La ruptura If -> arroja los LI que contienen UL ya que los LI anidados ahora están duplicados.

La salida de impresión es ahora:

  • 102 dálmatas (2000)
  • 10th & Wolf (2006)
  • 11:14 (2006)
  • 12:08 al este de Bucarest (2006)
  • 13 pasando el 30 (2004)
  • 1408 (2007)
  • ...

Gracias


Una lista de comprensión podría funcionar, también.

lis = [li for ul in uls for li in ul.findAll(''li'')]


.findAll() funciona para elementos li anidados:

for ul in uls: for li in ul.findAll(''li''): print(li)

Salida:

<li>List items</li> <li>Etc...</li> <li>List items</li> <li>Nested list items</li> <li>Nested list items</li> <li>List items</li>