我在网站和stackoverflow上看了很多例子,但我找不到我的问题的通用解决方案。我正在处理一个非常混乱的网站,我想抓一些数据。标记看起来像这样:
...
<body>
...
<table>
<tbody>
<tr>
...
</tr>
<tr>
<td>
...
</td>
<td>
<table>
<tr>
...
</tr>
<tr>
<td>
<a href="...">Some link</a>
<a href="...">Some link</a>
<a href="...">Some link</a>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</body>
我遇到的问题是没有任何元素具有我可以选择缩小范围的属性。在每个“...”内部可能会有类似的标记,例如更多<a>
的{{1}}以及诸如此类的内容。
我知道<table>
对于我需要的链接是唯一的,但BeautifulSoup如何抓住这些链接?我不确定如何在不做一堆单独的代码行的情况下抓取嵌套标签。
任何帮助?
答案 0 :(得分:11)
您可以使用CSS selectors in select
:
soup.select('table tr table tr td a')
In [32]: bs4.BeautifulSoup(urllib.urlopen('http://google.com/?hl=en').read()).select('#footer a')
Out[32]:
[<a href="/intl/en/ads/">Advertising Programs</a>,
<a href="/services/">Business Solutions</a>,
<a href="https://plus.google.com/116899029375914044550" rel="publisher">+Google</a>,
<a href="/intl/en/about.html">About Google</a>,
<a href="http://www.google.com/setprefdomain?prefdom=RU&prev=http://www.google.ru/&sig=0_3F2sRGWVktTCOFLA955Vr-AWlHo%3D">Google.ru</a>,
<a href="/intl/en/policies/">Privacy & Terms</a>]