无法使用xpath从某些内容中获取名称

时间:2017-11-30 11:47:56

标签: python-3.x xpath web-scraping lxml

我编写了一个非常简单的xpath来解析某些内容的名称,但它既不工作也不抛出任何错误。在我看来,我没有做错任何事。有人可以告诉我为什么下面的xpath表达式不起作用?感谢您的任何意见。

我试过这样:

from lxml.html import fromstring

content='''
    <Traveller>
        <name>John</name>
        <passnum>572014</passnum>
        <addr>Florida</addr>
    </Traveller>
    <Traveller>
        <name>Craig</name>
        <passnum>516114</passnum>
        <addr>Boston</addr>
    </Traveller>
'''
root = fromstring(content)
for item in root.xpath("//Traveller/name/text()"):
    print(item)

预期产出:

John
Craig

2 个答案:

答案 0 :(得分:1)

如果您在lxml.html解析后打印文档,您会看到所有元素名称都变为小写,这就是您尝试的xpath不起作用的原因:

....
>>> from lxml import html
>>> html.tostring(root)
'<span><traveller>\n        <name>John</name>\n        <passnum>572014</passnum>\n        <addr>Florida</addr>\n    </traveller>\n    <traveller>\n        <name>Craig</name>\n        <passnum>516114</passnum>\n        <addr>Boston</addr>\n    </traveller>\n</span>'

并使用小写作品:

>>> for item in root.xpath("//traveller/name/text()"):
...     print(item)
... 
John
Craig

答案 1 :(得分:1)

正确/有效的xml / html文档应始终包含 root 标记/节点,即包含所有剩余节点的主要父标记。

正确的方法应如下:

from lxml.etree import fromstring

content='''
<travels>
    <Traveller>
        <name>John</name>
        <passnum>572014</passnum>
        <addr>Florida</addr>
    </Traveller>
    <Traveller>
        <name>Craig</name>
        <passnum>516114</passnum>
        <addr>Boston</addr>
    </Traveller>
</travels>
'''
root = fromstring(content)
for item in root.xpath("//Traveller/name/text()"):
    print(item)

输出:

John
Craig