【问题标题】:Nokogiri: Finding all tags in a direct path, not including arbitrary levels of nestingNokogiri:在直接路径中查找所有标签,不包括任意级别的嵌套
【发布时间】:2014-05-13 12:54:04
【问题描述】:

假设我有一个 html 文档,例如:

<div id='findMe'>
  <table>
    <tr>
      <td>
        <p>
          <a href="bad">bad</a>
        </p>
      </td>
    </tr>
  </table>
  <p>
    This is some text and this is a <a href="good">link</a>
  </p>
</div>

我想捕获所有链接而不是 div #findMe,在段落标签内,而不是在表格或任何其他标签内。所以,我想要标有“好”的那个,而不是标有“坏”的那个。我正在尝试:

Nokogiri::HTML(html).css('#findMe p a')

但这会捕获两个链接。我还尝试了更明确的 xpath:

Nokogiri::HTML(html).css('#findMe').xpath('//p/a')

但这是做同样的事情。如何告诉 Nokogiri 只搜索树下的特定路径?

【问题讨论】:

    标签: ruby xpath nokogiri


    【解决方案1】:

    在 CSS 中使用 &gt; 选择直接后代。

    Nokogiri::HTML(html).css('#findMe > p > a')
    

    或者在 xpath 中使用/

    Nokogiri::HTML(html).xpath("//div[@id='findMe']/p/a")
    

    【讨论】:

    • 好的,如果我希望该 div 中的所有 &lt;p&gt; 标记都可以,这是否可行?以及所有这些中的所有&lt;a&gt;标签?我想这里的问题不太清楚。
    【解决方案2】:

    想出了一个方法来做到这一点,但我仍然对 xpaths 不太满意,所以如果这不是最好的方法,请随时发布更规范的方法来实现这一点。

    Nokogiri::HTML(html).css(#findMe').xpath('//div/p/a')
    

    【讨论】:

    • 您的 XPath 正在选择 all 文件中的 divs(并忽略 css() 选择器的上下文。)css() 选择器匹配 一个具有findMe ID 的 元素,恰好是div,但随后XPath 表达式忽略了该结果并从all 中获取a 元素的节点集分区。那是你真正想要的吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多