使用XPath选择包含特定类的表

时间:2013-08-24 16:00:58

标签: html xml xpath

我有一个HTML表,我需要使用XPath选择。该表可能包含也可能不包含多个类,但我只想要包含特定类的表。

以下是HTML代码段示例:

<html>
  <body>
    <table class="no-border">
      <tr>
        <th colspan="2">Blah Blah Blah</th>
      </tr>
      <tr>
        <td>Content</td>
        <td>
          <table class="info no-border">
            <tr>
              <!-- Inner table content -->
            </tr>
          </table>
        </td>
      </tr>
    </table>
  </body>
</html>

我需要使用XPath来检索包含类info的表。我尝试过使用/html/body/table/tr/td/table[@class='info*'],但这不起作用。我试图检索的表可能存在于HTML文档中的任何地方 - 技术上,不是任何地方,但外表和内表之间可能存在不同级别的层次结构。

如果有人能指出我正确的方向,我将不胜感激。

4 个答案:

答案 0 :(得分:4)

您可以做的最接近的是contains功能:

//table[contains(@class,'info')]

但请注意,这将捕获包含类information的表或具有info子字符串的任何其他内容。据我所知,XPath无法区分全字匹配。因此,您必须过滤结果以检查这种可能的情况。

答案 1 :(得分:0)

XPath 1.0的字符串处理确实相当有限。您可以使用starts-with() substring()和类似功能进行适量的处理。请参阅this answer以创建类似于正则表达式的内容。

XSLT2.0(并非所有浏览器和软件支持)都支持regex。

答案 2 :(得分:0)

您理想情况下需要的是table.info之类的CSS选择器。一些XML / HTML解析的XPath引擎和工具包确实支持这些选择器,这些选择器在内部被转换为XPath表达式,例如cssselect如果您使用Python并且包含在lxml中,或Nokogiri包含在Ruby中。

在一般情况下,要使用XPath模拟table.info之类的CSS选择器,常见的技巧或模式是使用contains()结合concat()和空格字符。在您的情况下,它看起来像这样:

.//table[contains(concat(' ', normalize-space(@class), ' '), ' info')]

答案 3 :(得分:0)

我知道您没有要求此答案,但我认为这会帮助您更准确地查询。

//table[ (contains(@class,"result-cont") or contains(@class,"resultCont")) and not(contains(@class,"hide")) ]

这将获得包含“result-cont”或“resultCont”的类,而没有“hide”类。