【问题标题】:nokogiri replacenokogiri replace
【发布时间】:2011-06-10 09:10:26
【问题描述】:

我正在解析 HTML 文档并尝试替换图像 src。当我在控制台中尝试它时,它似乎做了我想要的,但是在我的模型中它似乎没有保存它。现在,我不确定我在 Rails 中的保存方式是否有问题(我正在尝试更新内容字段并用本地图像替换外部图像),或者它是否使用 nokogiri,但它没有保存使用set_attribute 方法的结果

它完美地完成了其余的工作。

  before_save :replace_zemanta_images

  def replace_zemanta_images
    doc = Nokogiri::HTML(content)
    unless doc.css('div.zemanta-img').blank?
      doc.css('div.zemanta-img img').each do |img|
        io = open(URI.parse(img[:src]))
        if photos.find_by_data_remote_url(img[:src]).blank?
          photo = photos.build(:data => io, :data_remote_url => img[:src])
          img.set_attribute('src', photo.data.url(:original)) #doesn't work!
        end
      end
    end
  end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 nokogiri


    【解决方案1】:

    JackChance 提到在这里使用Nokogiri::HTTP::DocumentFragment.parse(content) 作为片段(如果你不想要 DOCTYPE/HTML/BODY 标签),我没有任何运气,因为我原来的 HTML 是一个 sn-p 而不是整个文档。

    我最终使用了这样的东西: html = Nokogiri::HTML.fragment 最初将 HTML 字符串 sn-p 转换为 Nokogiri 对象,而不需要不必要的标签。

    那么一旦我们使用img.set_attribute,我们就可以转换回html.to_s

    【讨论】:

      【解决方案2】:

      我假设content 是您模型上的一个属性。

      当您执行img.set_attribute 时,您正在更新Nokogiri::XML::Element 对象中的属性,但这不会更新content 的文本。

      在您的方法结束时,您需要添加如下内容:

      self.content = doc.to_s
      

      【讨论】:

      • 完美,我知道我忽略了一些东西!谢谢
      • 我还注意到 Nokogiri 似乎在抛出 和 body 标记......不管它是否存在。知道如何防止它这样做吗?
      • 您输入 Nokogiri 的 HTML 和您通过 doc.to_s 输出的 HTML 之间通常存在细微差别。这是它通过解析器的结果,据我所知,没有办法避免它。
      • 您可能想使用doc = Nokogiri::HTTP::DocumentFragment.parse(content) DocumentFragment 不使用 或 标签包装它,它按原样使用。
      猜你喜欢
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 2019-02-19
      • 2021-06-07
      • 2013-01-19
      相关资源
      最近更新 更多