我有一个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文档中的任何地方 - 技术上,不是任何地方,但外表和内表之间可能存在不同级别的层次结构。
如果有人能指出我正确的方向,我将不胜感激。
答案 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”类。