如何在Beautiful Soup中获取嵌套元素

30 投票
2 回答
58298 浏览
提问于 2025-04-15 12:34

我在抓取一些在 <td> 标签里的 hrefs 时遇到了困难。这个 <table><tr><td> 标签都没有任何类名或ID。

如果我想在这个例子中抓取 链接,我需要做些什么呢?

<tr>
    <td><a>...

谢谢。

2 个回答

32

像这样吗?

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
anchors = [td.find('a') for td in soup.findAll('td')]

这个代码应该能找到你提供的HTML中每个“td”标签里的第一个“a”标签。你可以调整一下 td.find,让它更具体一些,或者如果每个“td”里有多个链接的话,可以使用 findAll

更新:针对Daniele的评论,如果你想确保列表里没有 None 的话,你可以这样修改列表推导式:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
anchors = [a for a in (td.find('a') for td in soup.findAll('td')) if a]

这个修改基本上就是加了一个检查,看看 td.find('a') 是否返回了一个实际的元素。

35

根据文档的说明,首先你需要创建一个解析树:

import BeautifulSoup
html = "<html><body><tr><td><a href='foo'/></td></tr></body></html>"
soup = BeautifulSoup.BeautifulSoup(html)

然后你可以在这个解析树中进行搜索,比如查找那些直接父元素是 <td><a> 标签:

for ana in soup.findAll('a'):
  if ana.parent.name == 'td':
    print ana["href"]

撰写回答