id // * [@ id =“page”]上的xpath查询返回两个元素

时间:2015-08-31 01:12:49

标签: python html xpath web-scraping lxml

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

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

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

>>>len(s) == 2
True

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

查看您关联的网页的网页来源,页面中只有两个元素id。很可能是表格的顶部之一,而另一个是表格的底部。

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

创建xpath
//*[@id="elementID"]

你得到的是什么。

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

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