【问题标题】:XPath escape characters (HtmlUnit)XPath 转义字符 (HtmlUnit)
【发布时间】:2015-05-01 15:48:04
【问题描述】:

我正在使用 HtmlUnit,因此我正在使用 XPath。 我正在尝试查找具有特定值的属性的元素,但是我的结果没有返回任何内容。我怀疑这是由于此值中符号的性质:“$”和“=”。 我试图拉的元素的一个例子是:

<span data-reactid=".3.1.0.0.1:1.0.1.0.1:$0.$=12:$2.2">

我用来尝试拉取它的代码是:

page.getFirstByXPath("//span[@data-reactid='.3.1.0.0.1:1.0.1.0.1:$0.$=12:$2.2']");

如果我怀疑等号会出现问题,我想它是美元符号,但也许我完全错了。

我的问题是,a) 是否确实与转义字符有关,b) 如果不是,为什么结果不是我想要的?

如果需要,可以发布更多代码,但我想这已经足够了。

谢谢!

【问题讨论】:

  • 我看不出您的 XPath 有什么明显错误。我们可能需要足够的代码和 HTML 输入来重现问题。
  • '//span' 带给你什么?

标签: java html xpath htmlunit html-escape-characters


【解决方案1】:

下面的作品,可能你有一个与 XPath 无关的页面问题,例如未找到元素

HTML代码:

<html>
<body>
<span data-reactid=".3.1.0.0.1:1.0.1.0.1:$0.$=12:$2.2">
</span>
</body>
</html>

Java 代码:

try (WebClient webClient = new WebClient()) {
    HtmlPage page = webClient.getPage("http://localhost/test.html");
    Object o = page.getByXPath("//span[@data-reactid='.3.1.0.0.1:1.0.1.0.1:$0.$=12:$2.2']");
    System.out.println(o);
}

【讨论】:

  • 这是误导。 XPath 没有为字符串定义任何转义机制。在 XPath 字符串中转义是从不必要的,“最新快照”与它完全无关。
  • 你是对的,但我总是用最新的快照进行测试,以防有人使用旧版本
  • 这是值得称赞的,但你的回答听起来好像有任何机会会有所作为。事实上,在 XPath 字符串中进行字符转义实际上是不可能的。一直都是。它在规范中是这样的。所以无论 OP 在做什么,他使用的软件版本是完全无关的。
  • 谢谢,原来是我的理解有缺陷。我已经发布了我的学习作为答案。
  • 当不用作命名空间的一部分时,“:”(冒号)字符呢?我有将元素名称返回为“media:thumbnail”的代码 - 我可以使用什么 XPath 来找到它?
【解决方案2】:

所以我自己解决了这个问题,感谢所有发帖者的帮助。

按照我提出问题的顺序:
a) XPath 字符串中不可能进行字符转义,因此这与我的怀疑无关。
b) 没有得到我想要的结果的原因是对 XPath 语法的简单误解。
我以为//span[@data-reactid='.3.1.0.0.1:1.0.1.0.1:$0.$=12:$2.2'] 会找到第一个具有给定属性和值的&lt;span&gt; 元素,但实际上它是找到具有给定属性和值的第一个元素, &lt;span&gt; 元素中,不管它是否是 &lt;span&gt; 元素本身。因此 XPath 实际上返回了一个具有相同 data-reactid 值的 &lt;strong&gt; 元素,因此当我在返回的 HtmlElement 上调用 .getTextContent() 时,没有要返回的文本。

【讨论】:

  • 您能否给出一个返回 的最小 HTML/java 案例,好吗?它是否与真实浏览器的功能相匹配?
  • 我不确定你在问什么?
  • //span 返回 是一个错误,我试图重现该错误但没有成功。如果您可以提供 //span 返回强的 HTML,那么可以进一步调查,并在 HtmlUnit 中修复。
  • 也许那不是当时的确切代码,我可能已经对其进行了调整并忘记了,但无论如何我肯定在我的 xpath 中使用了“span”,并返回了一个强大的元素。可能是一个斜线或如此不同,但我现在不记得了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多