0

我以前在某处读过,但现在无法解释这个问题,所以如果有人能指出我正确的方向,我将不胜感激。

我正在为 HTML 文档的规范 XPath 创建 XPath 选择器。下面是一个简单的示例(包含在 HTMLUnit 中,它在其背景上使用 xalan,但可以是任何 XPath 处理器)。

如果我运行:

WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[*]/text()"));

我得到一个 [] 响应。但是,如果我改为运行(注意 a[ * ] vs a[ /* ]:

WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[/*]/text()"));

我得到 [Developers Section] 作为回应。

可以在位置谓词中添加通配符作为参数(即 [ * ])。但是,对于某些节点/标签(我特别注意到文本节点为 h1、h2...、p、b、strong 以及其他一些 html 标签为 li 或 ul)有时需要在通配符之前使用斜杠(即 [ / * ]) 得到结果。

有人可以提供有关这意味着什么的背景吗?我无法在 web 或 XPath 规范中找到对此的引用。

4

2 回答 2

1

如果您使用“通配符”的意图只是选择a路径下出现的任何内容/html/body/footer/div/div/div[2]/div[4]/ul/li[2],那么您根本不需要谓词。你可以这样做:

/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a

这将选择路径的所有 a子元素/html/body/footer/div/div/div[2]/div[4]/ul/li[2]

于 2013-08-01T09:35:15.020 回答
0

你想做什么?你在for上使用什么谓词?

据我所知a[*],选择a节点元素(请参阅评论 - 谢谢),因此失败,因为没有子元素(类似于h1h2... p,,b)。

相比之下,a[/*]选择a根以下的任何内容(更准确地说,在任何具有根的文档中 - 再次,请参阅评论)。这对所有节点都是正确的,但完全没有意义。

我认为你应该使用/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a/text()

[更新:] 路径可以是“模糊的”,匹配多个事物,并会返回一组结果。你不需要做任何特别的事情(比如 use [*])来做到这一点。所做[...]的只是添加额外的约束。它使事情更加具体。您不需要任何东西来降低具体性 - 默认设置是尽可能通用。

于 2013-08-01T03:46:16.673 回答