Python 美化组按属性导航divs而不使用findAll

Python 美化组按属性导航divs而不使用findAll,python,html,beautifulsoup,Python,Html,Beautifulsoup,如何通过调用soup的属性来查找特定的div?i、 例如soup.html.body.div但是我不知道如何在这里使用id='idname'获取特定的div 我可以使用soup.findAll(id='idname')[0]来获取特定的标记,但据我所知,这是在搜索整个soup 我想,由于您没有使用findAll(),因此在soup上获取divby属性会更快 Firebug将位置报告为html.body.div[2].form.table[2].tbody.tr[3]…但是执行soup.html.

如何通过调用soup的属性来查找特定的div?i、 例如
soup.html.body.div
但是我不知道如何在这里使用
id='idname'
获取特定的div

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

我想,由于您没有使用
findAll()
,因此在soup上获取divby属性会更快

Firebug将位置报告为
html.body.div[2].form.table[2].tbody.tr[3]…
但是执行
soup.html.body.div[2]
会给出一个键错误

更新:

假设您想从firebug中抓取“我觉得很幸运”按钮,firebug报告如下:

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


有没有一种方法不使用
findAll
就可以达到这个目的?

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

有一种
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]