Beautifulsoup按属性导航div而不使用findAll

时间:2012-01-13 15:17:50

标签: python html beautifulsoup

如何通过调用汤的属性找到特定的div?即soup.html.body.div之类的东西,但是我不知道如何在id='idname'找到具体的div?

我可以soup.findAll(id='idname')[0]来获取特定标签,但据我所知,这是搜索整个汤。

我想,因为你没有使用findAll(),所以获取汤上的div属性会更快?

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 个答案:

答案 0 :(得分:3)

从Firebug获取的路径是XPath表达式。最好使用一个允许你直接使用xpath的解析器。我喜欢将lxmletree接口一起使用:

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]')

答案 1 :(得分: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]