我有这样一个 HTML:
html =<<EOS
<table><!-- outer table -->
<tr><td>
<table><!-- inner table 1 -->
<tr><td>Foo</td></tr>
</table>
<table><!-- inner table 2 -->
<tr><td>Bar</td></tr>
</table>
</td></tr>
</table>
EOS
我想从静态值 Foo
中获取变化的值 Bar
。
通过这段代码我可以获得值。
Nokogiri::HTML(html)
doc.xpath("//table[tr/td[text()='Foo']]/following-sibling::table//td").text
我想这样重写:
doc.xpath("//table[//td[text()='Foo']]/following-sibling::table//td").text
但是这段代码不起作用,因为 //table[//td[text()='Foo']]
匹配外部表而不是内部表。
XPath 中是否有这样的最近向后匹配
表达式?
//table[(最近匹配表达式)td[text()='Foo']]
最佳答案
是的,//table[//td[text()='Foo']]
给出外表作为第一个结果(不是唯一的结果),但是 //table[//td[text()='Foo']]/following-sibling::table//td
仍然检索 <td>Bar</td>
.
//table[//td[text()='Foo']]
的问题部分是 //
在 td
前,因为它选择了所有后代 td
元素:
<table>
<tr>
<td>This is selected</td>
<td>
<table>
<tr>
<td>This is also selected</td>
</tr>
</table>
</td>
</tr>
</table>
你应该使用 //
只是很少。我会使用表达式
//table[tr/td = 'Foo']/following-sibling::table[1]/tr/td
编辑:正如 Phrogz 在 Nokogiri 中所建议的,而不是 [1]
在上面的表达式中,您可以使用 at_xpath
如
doc.at_xpath(//table[tr/td = 'Foo']/following-sibling::table/tr/td).text
只获取找到的第一个结果节点。也就是说,如果您实际上只想找到一个节点,并且所需节点是文档顺序中的第一个节点。
关于html - 如何使用 XPath 向后匹配最近的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28063519/