xpath查询id //*[@id="page"] returns两个元素

xpath query on id //*[@id="page"] returns two elements

我正在尝试废弃网站 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还是我做错了什么??

查看您 link 编辑的页面的页面源代码,页面中恰好有两个包含 id 的元素。最有可能的是 table 的顶部,另一个是 table 的底部。

firebug 的副本 minimal xpath 版本基于元素的 id 工作。它仅适用于具有 id 标签的元素,它会创建格式为 -

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

这就是你得到的。

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

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

您通常可以通过始终执行以下操作来解决此问题:

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

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