3

我有一个 XHTML 文档,我想选择其中唯一一个带有 class="index" 的表。

如果我理解正确,后代轴将选择从当前节点直接和间接下降的所有节点,所以这就是我所得到的。

//descendant::table[@class="index"]

使用 xmlstarlet 进行测试时,它似乎不起作用。是我的工具坏了,还是 XPath 表达式错误?

4

4 回答 4

4

我想//table[@class="index"]这就是你想要的

于 2009-05-19T08:06:58.907 回答
3

根据您的示例页面(metacritic.com/film/highscores.shtml),我会说您需要使用:

//TABLE[@CLASS="index"] 
(or /descendant::TABLE[@CLASS="index"])

这是因为带有 CLASS 索引的 TABLE 在您的示例页面上以大写形式写入(XML 和 XPath 区分大小写)。

如果您针对特定页面,这将起作用,但如果不同页面对相同的 html 标签使用不同的大小写,则可能会成为问题。

然后你需要一个可憎的东西

//TABLE[@CLASS="index" or @class="index" or @Class="index" or ...]
|//table[@CLASS="index" or @class="index" or ...]
|...

因此,您可能需要在提取信息之前继续使用 Tidy,或者切换到专门用于 HTML 抓取的工具(而不是 XPath)

于 2009-05-20T23:14:36.087 回答
1

是的,descendant轴选择从上下文节点下降的所有节点。但这里的关键是上下文节点。

例如,descendant::span将检索span当前节点的所有后代。同样,descendant::*将检索当前节点的所有后代元素。

如果您需要匹配表和子表,您提供的 XPath 在我的测试期间可以正常工作:

//descendant::table[@class="index"]

...选择表本身和子节点。

如果只需要匹配表的孩子,首先匹配你想要的节点,然后匹配它的后代:

//table[@class="index"]/descendant::*

.. 仅选择表的子节点。

于 2009-05-19T08:21:55.977 回答
0

使用此代码

   let $info :=($p//descendant::TABLE[@class="index"])
        return $info
于 2016-06-13T11:29:11.917 回答