【问题标题】:Find and replace entire HTML nodes with Nokogiri使用 Nokogiri 查找和替换整个 HTML 节点
【发布时间】:2010-08-10 14:02:44
【问题描述】:

我有一个 HTML,应该对其进行转换,将一些标签替换为另一个标签。

我不知道这些标签,因为它们来自 db。所以,Nokogiri 的set_attributename 方法不适合我。

我需要这样做,就像在这个伪代码中一样:

def preprocess_content
  doc = Nokogiri::HTML( self.content )
  doc.css("div.to-replace").each do |div|
    # "get_html_text" will obtain HTML from db. It can be anything, even another tags, tag groups etc.
    div.replace self.get_html_text
  end
  self.content = doc.css("body").first.inner_html
end

我找到了Nokogiri::XML::Node::replace 方法。我认为,这是正确的方向。

此方法需要一些node_or_tags 参数。

我应该使用哪种方法从文本创建一个新节点并用它替换当前节点?

【问题讨论】:

    标签: html ruby-on-rails replace nokogiri transformation


    【解决方案1】:

    这样:

    doc.css("div.to-replace").each do |div|
        new_node = doc.create_element "span"
        new_node.inner_html = self.get_html_text
        div.replace new_node
    end
    

    【讨论】:

    • 它对我不起作用。我生成一个错误:“未链接节点上没有上下文解析”。它以这种方式抱怨设置了“inner_html”属性的行
    • 我刚刚测试过,它可以在我的环境中运行。请尝试将new_node.inner_html = 替换为new_node.content = 并仔细检查是否有错误。它应该。
    • 谢谢,我知道了。问题是 - 将尚未链接的元素修改为 DOM。我们必须先替换,然后修改。这很好,但我遇到了一个更令人困惑的问题 - 不能插入任何标记作为替代。例如,当我说 "new_node.inner_html = "
      Test
      " - 它有效,但是当我说 new_node.inner_html = "" 时,它崩溃并显示消息“未定义的方法 `children' for nil:NilClass”...
    • 这是因为 HTML 的严格性。将Nokogiri::HTML( self.content ) 替换为Nokogiri::XML( self.content ),以后不要忘记手动添加 DOCTYPE 声明。
    • 谢谢,它似乎工作,但我怎样才能将所有的东西都转换回字符串,以保存它?我执行以下操作:“self.content = doc.css("body").first.inner_html”,但它抱怨由“first”返回的 nil 类。但是,对于 Nokogiri:HTML 它确实有效
    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多