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>