使用BeautifulSoup通过属性遍历div而不使用findAll

4 投票
2 回答
1549 浏览
提问于 2025-04-17 10:11

我想知道怎么通过调用一个“汤”的属性来找到特定的div。比如说像 soup.html.body.div 这样,但我不知道怎么在这里获取 id='idname' 的特定div。

我可以用 soup.findAll(id='idname')[0] 来获取这个特定的标签,但我理解这其实是在搜索整个“汤”。

我想如果直接通过属性在“汤”里获取div会更快,因为这样就不需要用 findAll() 了,对吧?

Firebug 显示的位置是 html.body.div[2].form.table[2].tbody.tr[3]...,但是用 soup.html.body.div[2] 时却出现了键错误。

更新:

假设你想从 http://www.google.com 抓取 我感觉幸运 的按钮,Firebug 显示它的位置是:

/html/body/center/span/center/div[2]/form/div[2]/div[3]/center/input[2]

有没有办法在 使用 findAll 的情况下到达这个位置呢?

2 个回答

1

这里有一个叫做 findChildren 的方法,它能帮我们完成大部分工作。

这个方法的功能相当于:

findAll(tagname, recursive=False)

通常使用这个方法会让事情变得更高效。

所以你的例子可以变成:

soup.html.body.center.span.center.findChildren('div')[2].\
    form.findChildren('div')[2].findChildren('div')[3].\
    center.findChildren('input')[2]
3

你从Firebug得到的路径是一个XPath表达式。最好使用一个可以直接使用XPath的解析器。我个人喜欢用lxml和它的etree接口:

from lxml import etree
tree = etree.parse(yourfile)
lucky = tree.xpath('/html/body/center/span/center/div[2]/form/div[2]/div[3]/center/input[2]')

撰写回答