【问题标题】:Nokogiri: Removing all nodes that have a string NOT inside specific tagNokogiri:删除所有不在特定标签内的字符串的节点
【发布时间】:2013-12-24 15:41:25
【问题描述】:

我有一个 Nokogiri 实例,我想删除所有包含文本“TITLE OF ARTICLE”且不在 h1 标记内的节点?

htmlSource = "<HTML><H1>TITLE OF ARTICLE</H1><b>TITLE OF ARTICLE</b></HTML>"
nokogiri = Nokogiri::HTML(htmlSource)
headers = nokogiri.xpath('//h1')
#what to do next?
#I want the output to be <HTML><H1>TITLE OF ARTICLE</H1></HTML>

【问题讨论】:

    标签: ruby xpath nokogiri


    【解决方案1】:

    要排除h1标签,可以使用*[name()!="h1"] xpath表达式;然后使用NodeSet#remove 删除匹配的节点。

    matched = nokogiri.xpath('//*[name()!="h1"][text()="TITLE OF ARTICLE"]')
    matched.remove()
    

    替代使用css方法:

    matched = nokogiri.css('*[name()!="h1"][text()="TITLE OF ARTICLE"]')
    matched.remove()
    

    【讨论】:

      【解决方案2】:

      这是我将如何使用Nokogiri::XML::NodeSet#remove

      require 'nokogiri'
      
      htmlSource = "<HTML><H1>TITLE OF ARTICLE</H1><b>TITLE OF ARTICLE</b></HTML>"
      nokogiri = Nokogiri::HTML.parse(htmlSource)
      node_to_remove = nokogiri.xpath('//*[not(self::h1) and .="TITLE OF ARTICLE"]')
      node_to_remove.remove
      puts nokogiri
      # >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
      # >> <html><body><h1>TITLE OF ARTICLE</h1></body></html>
      

      【讨论】:

      • 如何使这个通用化?可能是粗体之外的其他标签。
      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 2016-08-25
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多