使用XPath选择特定表

时间:2009-05-19 08:01:26

标签: xml xslt xpath screen-scraping

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)

答案 2 :(得分:1)

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

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

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

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

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

如果您只需要匹配表的子项,首先匹配您想要的节点,然后匹配其后代:

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

..仅选择表的子节点。

答案 3 :(得分:0)

使用此代码

   let $info :=($p//descendant::TABLE[@class="index"])
        return $info