【问题标题】:Unable to source name out of some content using xpath无法使用 xpath 从某些内容中获取名称
【发布时间】:2017-11-30 11:47:56
【问题描述】:

我编写了一个非常简单的 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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 是的是的!!!!就是这个。我几乎发疯了,发现我做错了什么。所以这是case 问题。感谢 har07,您的回答和清晰度..
    【解决方案2】:

    正确/有效的 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
    

    【讨论】:

    • 感谢 RomanPerekhrest 的回答。它也有效。有太多收获的答案。为此 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多