from - how to use beautifulsoup in python
hermosa sopa consigue niƱos que son etiquetas(no cadenas navegables) de una etiqueta (1)
Gracias a JFSebastian , lo siguiente funcionará:
rows=table.tbody.find_all(True, recursive=False)
Documentación aquí: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#true
En mi caso, necesitaba filas reales en la tabla, así que terminé usando lo siguiente, que es más preciso y creo que más legible:
rows=table.tbody.find_all(''tr'')
Nuevamente, documentos: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#navigating-using-tag-names
Creo que esta es una mejor manera de iterar a través de todos los niños de una etiqueta.
Trabajó con la siguiente entrada:
<table cellspacing="0" cellpadding="0">
<thead>
<tr class="title-row">
<th class="title" colspan="100">
<div style="position:relative;">
President
<span class="pct-rpt">
99% reporting
</span>
</div>
</th>
</tr>
<tr class="header-row">
<th class="photo first">
</th>
<th class="candidate ">
Candidate
</th>
<th class="party ">
Party
</th>
<th class="votes ">
Votes
</th>
<th class="pct ">
Pct.
</th>
<th class="change ">
Change from ‘08
</th>
<th class="evotes last">
Electoral Votes
</th>
</tr>
</thead>
<tbody>
<tr class="">
<td class="photo first">
<div class="photo_wrap"><img alt="P-barack-obama" height="48" src="http://i1.nyt.com/projects/assets/election_2012/images/candidate_photos/election_night/p-barack-obama.jpg?1352320690" width="68" /></div>
</td>
<td class="candidate ">
<div class="winner dem"><img alt="Hp-checkmark@2x" height="9" src="http://i1.nyt.com/projects/assets/election_2012/images/swatches/[email protected]?1352320690" width="10" />Barack Obama</div>
</td>
<td class="party ">
Dem.
</td>
<td class="votes ">
2,916,811
</td>
<td class="pct ">
57.3%
</td>
<td class="change ">
-4.6%
</td>
<td class="evotes last">
20
</td>
</tr>
<tr class="">
<td class="photo first">
</td>
<td class="candidate ">
<div class="not-winner">Mitt Romney</div>
</td>
<td class="party ">
Rep.
</td>
<td class="votes ">
2,090,116
</td>
<td class="pct ">
41.1%
</td>
<td class="change ">
+4.3%
</td>
<td class="evotes last">
0
</td>
</tr>
<tr class="">
<td class="photo first">
</td>
<td class="candidate ">
<div class="not-winner">Gary Johnson</div>
</td>
<td class="party ">
Lib.
</td>
<td class="votes ">
54,798
</td>
<td class="pct ">
1.1%
</td>
<td class="change ">
–
</td>
<td class="evotes last">
0
</td>
</tr>
<tr class="last-row">
<td class="photo first">
</td>
<td class="candidate ">
div class="not-winner">Jill Stein</div>
</td>
<td class="party ">
Green
</td>
<td class="votes ">
29,336
</td>
<td class="pct ">
0.6%
</td>
<td class="change ">
–
</td>
<td class="evotes last">
0
</td>
</tr>
<tr>
<td class="footer" colspan="100">
<a href="/2012/results/president">President Map</a> |
<a href="/2012/results/president/big-board">President Big Board</a> |
<a href="/2012/results/president/exit-polls?state=il">Exit Polls</a>
</td>
</tr>
</tbody>
</table>
La documentación de sopa hermosa proporciona atributos .contents y .children para acceder a los elementos secundarios de una etiqueta determinada (una lista y un iterable, respectivamente) e incluye cadenas y etiquetas navegables. Solo quiero a los niños de tipo Tag.
Actualmente estoy logrando esto usando la lista de comprensión:
rows=[x for x in table.tbody.children if type(x)==bs4.element.Tag]
pero me pregunto si existe una forma mejor / más pythonic / built-in para obtener solo Tag niños.