我正在学习Scrapy,并想知道是否有一些现有的工具 - 可能是Chrome Maybe Web Developer或Firefox插件,可以快速获得Web元素的XPath。或者最好的方法是学习Xpath并从头开始构建Xpath。
答案 0 :(得分:2)
适用于Chrome ...
有一些插件,例如XPath Helper,可以为HTML页面上的给定元素生成XPath。您还可以右键单击页面中的元素,然后在“元素”选项卡中拉出其位置。从那里,您可以右键单击并选择复制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返回的低值。 ; - )
答案 1 :(得分:2)
没有“元素的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')
。