gpt4 book ai didi

javascript - XPath 在 Firefox/GreaseMonkey 中阻塞实体

转载 作者:行者123 更新时间:2023-11-30 06:07:18 31 4
gpt4 key购买 nike

我正在编写一个相当基本的 GreaseMonkey 脚本,该脚本在特定元素中定位文本,然后使用该文本稍后执行操作。相关代码如下:

在 HTML 中有一个带有类 'someclass' 的跨度,它包含一小段文本:

<span class="someclass">some text</span>

然后在 JavaScript 中我试图找到这个类并使用标准的 XPath jazz 将它的内容(“一些文本”)拉到一个变量中:

document.evaluate("//span[@class='someclass']/text()", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

这就是问题所在:当我在“某些文本”是具有基本字符的基本字符串的页面上运行它时,一切正常,但是当我在“某些文本”包含实体的页面上运行它时,它会失败。例如,这些都很好,XPath 返回我想要的文本:

<span class="someclass">some text</span>
<span class="someclass">some other text</span>
<span class="someclass">sometext</span>
<span class="someclass">some text 12345</span>

但是,这给了我一个错误:

<span class="someclass">some text&#39;s text</span>

返回的错误是:

Error: The expression is not a legal expression.
Source File: file:///blahblahblah.user.js
Line: (JS line i gave above)

我在这里和 Google 上找到了一些关于 XPath 如何处理实体的问题的结果,但他们都在做类似 [text() = 'blah &racquo; blah'] — 换句话说,它们的实体在 XPath 查询本身中。我的不是,它们在我试图从 XPath 查询返回的文本中。

这是同一个问题吗?有什么简单的解决方法吗?

谢谢!

最佳答案

问题是 XPath 表达式中的字符串文字必须用引号或撇号括起来,并且不应包含周围的字符。

需要将同时包含引号和撇号的文字字符串(在您的情况下由您的 Javascript 程序)转换为不包含这两种类型字符的字符串。

执行此操作的最简单方法 是将其中一种字符的每个实例替换为其字符实体——比如替换每个 '&#39;并使用 '作为文字字符串的周围字符。

第二种方式是替换

some text&#39;s text

使用 XPath 表达式:

concat('some text', "'", ' text')

警告:使用不受信任的数据创建 XPath 表达式不是一个好主意——这可能会导致 XPath injection 。为避免 XPath 注入(inject),如果您的编程语言和函数库允许这样做,请始终编译您的 XPath 表达式并通过将数据作为参数传递来运行它。

关于javascript - XPath 在 Firefox/GreaseMonkey 中阻塞实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3481490/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com