2

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

这是一个示例 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

4 回答 4

5

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

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

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

于 2013-08-24T16:06:12.140 回答
1

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

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

.//table[contains(concat(' ', normalize-space(@class), ' '), ' info')]
于 2013-08-25T09:59:47.627 回答
1

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

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

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

于 2021-05-08T07:22:10.157 回答
0

实际上,XPath 1.0 在其字符串处理方面相当有限。starts-with() substring()您可以使用和类似的功能进行适量的处理。请参阅此答案以创建类似于正则表达式的内容。

XSLT2.0(并非所有浏览器和软件都支持)支持正则表达式。

于 2013-08-25T05:39:10.107 回答