【问题标题】:How to select nodes by matching text如何通过匹配文本来选择节点
【发布时间】:2010-12-01 06:35:17
【问题描述】:

如果我有一堆元素,例如:

<p>A paragraph <ul><li>Item 1</li><li>Apple</li><li>Orange</li></ul></p>

Nokogiri 中是否有内置方法可以获取所有包含文本“Apple”的p 元素? (例如,上面的示例元素会匹配)。

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

    Nokogiri 可以(现在)使用 jQuery 扩展 CSS 来做到这一点:

    require 'nokogiri'
    
    html = '
    <html>
      <body>
        <p>foo</p>
        <p>bar</p>
      </body>
    </html>
    '
    
    doc = Nokogiri::HTML(html)
    doc.at('p:contains("bar")').text.strip
    => "bar"
    

    【讨论】:

    • 如果您将 bar 替换为另一个文本,例如:"google encrypted \"google drive\" this year" 它会产生错误,任何想法如何正确转义 " 字符?
    • 尝试使用&amp;quot; 代替嵌入的引号?
    • 有没有办法在不知道什么类型的元素包含文本的情况下做到这一点?如果我执行doc.at(':contains("bar")')(即没有指定p 元素),那么我会得到整个文档。
    • 没关系,我找到了答案doc.at(':contains("foo"):not(:has(:contains("foo")))')这里makandracards.com/makandra/…
    【解决方案2】:

    这是一个有效的 XPath:

    require 'nokogiri'
    
    doc = Nokogiri::HTML(DATA)
    p doc.xpath('//li[contains(text(), "Apple")]')
    
    __END__
    <p>A paragraph <ul><li>Item 1</li><li>Apple</li><li>Orange</li></ul></p>
    

    【讨论】:

    • 我更喜欢这个,因为它返回匹配节点的所有实例,而接受的答案只返回 1 个节点。
    【解决方案3】:

    尝试使用这个 XPath:

    p = doc.xpath('//p[//*[contains(text(), "Apple")]]')
    

    【讨论】:

      【解决方案4】:

      您也可以使用Nikkou 轻松做到这一点:

      doc.search('p').text_includes('bar')
      

      【讨论】:

      • 嘿,谢谢你推荐 nikkou,我觉得这会节省我很多时间 :)
      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多