2013-08-24 39 views
1

我有一张需要使用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

你能做的最接近的是与contains功能:

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

但请注意,这将捕捉表类information,或任何其他具有info子。就我所知,XPath无法区分全字匹配。所以你必须过滤结果来检查这种可能的情况。

+0

这让我比我更进一步。如果没有人提供更优雅的解决方案,我会将其作为公认的答案。非常感谢,伙计! –

0

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

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

0

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

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

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