【问题标题】: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。