html - 如何使用 XPath 向后匹配最近的标签

标签 html ruby xpath nokogiri

我有这样一个 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/

相关文章:

javascript - d3 附加 img 到 li

ruby-on-rails - 如何从 Jquery Ajax 获取数据

php - 将 xPath 用于 sitemap.xml

javascript - 防止嵌套元素触发父元素的事件

html - 第一个菜单项看起来不同,:first-child element

javascript - 如何使用 jQuery 将此元素从悬停效果更改为点击效果?

ruby - PayPal Webhook URL 中的 HTTP 基本身份验证

ruby - 使用 Ruby 在谷歌驱动器中创建文件夹

SQL 服务器 : XPath to iterate through multiple elements and return values

java - 在未排序的 xml 文件中查找特定值