【问题标题】:xpath query on id //*[@id="page"] returns two elementsid 上的 xpath 查询 //*[@id="page"] 返回两个元素
【发布时间】:2015-08-31 01:12:49
【问题描述】:

我正在尝试废弃该网站ketabejam.ir 我正在使用 python3.4.1 和解析我使用 lxml 3.4.1
顺便说一句,我用 lxml.html.fromstring 方法解析它
当我在解释器上加载文档并要求以下查询以获取页数时,我可以处理分页:

s = doc.xpath("//*[@id='page']")

令人惊讶的是我得到了结果:

>>>len(s) == 2
True

我从 firebug 的最小 xpath 中得到了元素的地址, 当我选择 normal xpath 时,查询运行顺利
是bug还是我做错了什么??

【问题讨论】:

    标签: python html xpath web-scraping lxml


    【解决方案1】:

    您通常可以通过以下方式解决此问题:

    s = doc.xpath("(//*[@id='page'])[1]")
    

    ...如果您知道您真的只想要匹配的第一个节点,并且可以安全地忽略任何后续节点(在这种情况下这似乎是一个安全的选择)。

    【讨论】:

      【解决方案2】:

      查看您链接的页面的页面源,页面中恰好有两个带有id 的元素。很可能是表顶部的一个,而另一个表的底部。

      firebug 的复制minimal xpath 版本基于元素的id 工作。它仅适用于具有 id 标记的元素,并且它创建格式为 -

      的 xpath
      //*[@id="elementID"]
      

      你得到了什么。

      理想情况下,在每个 html 页面中,应该只有一个具有特定 id 的元素,即 id 在整个页面中应该是唯一的。似乎firebug 的最小 xpath 取决于此。

      在您的上下文中,我认为两个元素都返回相同的链接,因此您可以使用其中任何一个来继续抓取。或者如您所指,您可以使用普通的 xpath。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-14
        • 2016-04-20
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 2019-07-06
        相关资源
        最近更新 更多