使用BeautifulSoup通过属性遍历div而不使用findAll
我想知道怎么通过调用一个“汤”的属性来找到特定的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]')