查找元素的XPath的最简单方法

时间:2013-09-17 00:03:44

标签: xpath screen-scraping scrapy

我正在学习Scrapy,并想知道是否有一些现有的工具 - 可能是Chrome Maybe Web Developer或Firefox插件,可以快速获得Web元素的XPath。或者最好的方法是学习Xpath并从头开始构建Xpath。

2 个答案:

答案 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')