我正在学习 Scrapy,想知道是否有一些现有的工具——可能是 Chrome,也许是 Web Developer 或 Firefox 插件来快速获取 Web 元素的 XPath。或者最好的方法是学习 Xpath 并自己从头开始构建 Xpath。
2 回答
对于铬...
有一些插件,例如XPath Helper,可以为 HTML 页面上的给定元素生成 XPath。您还可以右键单击页面中的元素并在“元素”选项卡中拉出其位置。从那里,您可以右键单击并选择Copy XPath。
要真正学习 XPath,我建议您直接从头开始编写自己的。您可以使用 直接从控制台选择节点$x()
。例如,以下是在此页面上选择搜索表单的方法:
> $x("//form[@id='search']")
[<form id="search" action="/search" method="get" autocomplete="on">…</form>]
请注意,该form
元素将在控制台中以交互方式展开。
以下是如何选择此页面上包含单词Thanks的所有文本节点:
> $x("//text()[contains(.,'Thanks')]")
["Thanks a lot!", "Thanks for contributing an answer to Stack Overflow!"]
请注意,如果您在此页面上尝试,您将获得比我最初做的更多的匹配。奇怪的循环。
以下是如何选择此答案已收到的票数:
> $x("//div[@id='answer-18839594']//span[@class='vote-count-post ']/text()")
["0"]
请注意一个不幸的鲁棒性问题,其中vote-count-post
必须包含一个尾随空格来镜像当前源。还要注意那个 XPath 返回的不幸的低值。;-)
没有“元素的 XPath”这样的东西。您可能对多种路径感兴趣。最短的机器可执行路径可能是沿线*[3]/*[1]/*[2]
。最易读的路径是这样的chap[3]/section[1]/para[2]
;但这可能取决于命名空间上下文。对于您可能想要的无上下文路径*[local-name()='chap' and namespace-uri()='...'][1]/*[local-name()='section' and namespace-uri()='...'][3]
。但有时当人们要求“路径”时,他们只想要chap/section/para
,即选择包括目标元素在内的许多元素的路径。但出于某些目的,最有用的 XPath 表达式可能是id('Intro')
.