【问题标题】:How to get text based off 'Minimal Xpath'?如何根据“Minimal Xpath”获取文本?
【发布时间】:2014-06-11 22:49:29
【问题描述】:

我正在查看 firebug 中的一个页面,并确定了我需要从中获取文本的不同内容部分。 Firebug 提供了复制 Xpath 或 Minimal Xpath 的能力。

Xpath: /html/body/div[2]/div/div[2]/div[2]/form/div[2]/div/span[2]/input
Minimal Xpath: //*[@id="SeatCount"]

我正在尝试为greasemonkey 编写一个脚本,该脚本根据此内容获取文本。 我能够使用此位从其中一个字段中获取内容:

 var returnedValue = document.getElementById("SeatCount").textContent;

我想知道是否可以使用 Xpath 或更好的“最小 Xpath”来实现类似的东西(我不知道“最小 xpath”是否具有该格式所使用的更具体的名称?)

是否可以使用 xpath 选项来获取相关的文本内容?如果有,怎么做?

【问题讨论】:

  • 对于有 id 的元素,getElementById 总是比 XPath 更容易和更快。用它。 ... 对于所有其他情况,document.querySelectorAll() 几乎总是比 XPath 更容易和更健壮。

标签: xml xpath firebug greasemonkey


【解决方案1】:

标记为“XPath”的路径表示您要选择的元素的绝对位置路径,作为从根节点开始的一系列步骤。它基于位置谓词,这意味着如果您在文件结构中添加或删除任何内容,它的位置路径可能会改变。

名为“Minimal XPath”的路径是一个使用 *descendant-or-self 的表达式。它也从根节点开始,但匹配整个文件中带有 @ 的 any 元素987654324@ 属性包含值SeatCount。这通常更好,因为您不依赖文件结构,并且id 可以保证您检索到的结果是唯一的。

您可以使用evaluate 函数在JavaScript 中选择使用XPath。例如:

var result = document.evaluate('//*[@id="SeatCount"]', document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null );

更正:我在上面的答案中将 node 替换为 result 并更改了节点类型常量。正如@MartinHonnen 正确观察到的那样,evaluate() 不会返回节点,而是返回一个可以从中提取节点的对象。在您的情况下,由于您只有一个结果,您可以使用 singleNodeValue 来获取该节点。如果您的节点有文本内容,您可以使用以下方法检索该内容:

var contents = result.singleNodeValue.textContent;

MDN: XPath JavaScript documentationMDN: Using XPath

【讨论】:

  • evaluate 方法是应用 XPath 表达式的正确建议,但您的 sn-p 建议它返回一个节点,它从不返回,而是返回一个具有属性和方法的对象,如 @987654333 @ 属性,只要您使用带有返回单个节点的评估结果类型即可。
  • 谢谢@MartinHonnen。我用那个更正更新了答案。
  • singleNodeValue 不适用于您使用的结果类型,您需要将其更改为 var result = document.evaluate('//*[@id="SeatCount"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null );ANY_UNORDERED_NODE_TYPE
  • 已修复。再次感谢@MartinHonnen(我应该在发布之前对其进行测试以避免这些错误)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2022-01-03
  • 2021-02-18
  • 2021-10-04
相关资源
最近更新 更多