XPath选取包含指定文本的表格行

64

如何使用XPath选择包含指定文本的单元格的表行?


1
好问题,+1。请看我的答案,其中包含解释和解决方案。请注意,stefan.natchev的答案并没有选择所有具有所需属性的行。 :) - Dimitre Novatchev
2个回答

86

用途:

ExpressionSelectingTable/tr[td//text()[contains(., 'targetString')]]

这意味着:

选择由表达式ExpressionSelectingTable选择的任何表的每个子元素tr,并且该tr至少有一个td子元素,该子元素至少有一个文本节点后代包含字符串'targetString'


5
我认为你可能需要使用 ExpressionSelectingTable//tr[...],因为行可能是 theadtbody 和/或 tfoot 的子元素。 - Phrogz
2
@Phrogz:是的,这是一个很好的观察,谢谢。我的HTML有点生疏...我故意这样做的,因为可能会有一个表格在另一个表格内,我不想选择外部表格.. - Dimitre Novatchev
也许将关于 theadtbodytfoot 的注意事项移至答案本身是值得的,因为在编写 ExpressionSelectingTable 时,这正是我短板所在。我猜这很常见。 - cprn
@DimitreNovatchev,您好。抱歉问一个愚蠢的问题。我尝试在我的代码中使用您建议的代码,如下所示: xpath('//table[@class="table table--collapsible"]/tbody[@class="tbody"]/' 'tr[td//text()[contains(., "1 minute driving ")]]')当我尝试打印输出时,它显示了以下输出: <Element tr at 0x7f2890fd6a48>我想看到此行返回的值。我如何在Python中访问此返回行的内容? - Reza_M

13
要选择包含某些文本的单元格行,您可以使用以下XPath表达式: //tr/td[normalize-space(text())="香蕉"]/.. 这将选择包含文本“香蕉”的任何元素,并使用/..选择其父元素。

这并没有回答问题——必须选择包含“香蕉”的单元格的行。你的答案没有选择一个带有值为“苹果和香蕉”的单个tdtr - Dimitre Novatchev
此外,在编程中,达到某个节点然后返回并不是一个好的风格——在大多数情况下,存在一种只使用正向轴的等效表达方式。 - Dimitre Novatchev
2
虽然问题要求进行“包含”查询,但当您希望文本完全匹配但忽略空格时,我很高兴看到这个使用 “normalize_space” 的技巧。 - Mark Berry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接