对 ID //*[@id="page"] 的 XPath 查询返回两个元素



我试图废弃网站ketabejam.ir我使用python3.4.1,使用lxml 3.4.1进行解析
顺便说一下,我用lxml。html。fromstring方法
对它进行了解析当我在解释器上加载文档并请求以下查询以获取页面数时,我可以处理分页:

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

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

>>>len(s) == 2
True

我从firebug的最小xpath中获得了元素的地址,当我选择普通xpath时,查询运行得很顺利
这是一个bug,还是我做错了什么?

一般情况下,您可以这样做:

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

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

查看您链接的页面的页面源,页面中恰好有两个具有该id的元素。最有可能的是一个在桌子的顶部,另一个在桌子的底部。

firebug的copy minimal xpath版本基于元素的id工作。它仅对具有id标记的元素可用,并以以下格式创建xpath -

//*[@id="elementID"]

这就是你得到的。

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

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

最新更新