2011-01-17 24 views
2

私はHTML文書を解析していて、画像srcを置き換えようとしています。それは私がコンソールでそれを試みるときに私が望むことをするようだが、私のモデルではそれを保存していないようだ。今は、私がやっていることが、Railsに保存する方法(私はコンテンツフィールドを更新しようとしていて、外部の画像をローカルのものに置き換えようとしている)やnokogiriを使用しているなら間違っているかどうかはわかりませんが、 set_attributeメソッドを使用した結果nokogiri replace

それ以外は完全に行います。

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 

答えて

3

私はcontentがモデルの属性であると仮定しています。

img.set_attributeを実行しているときに、Nokogiri::XML::Elementオブジェクトの属性を更新していますが、これはcontentというテキストを更新しません。私は、(あなたがDOCTYPE/HTML/BODYタグを使用しない場合)フラグメントはこちらNokogiri::HTTP::DocumentFragment.parse(content)を使用することを述べた

self.content = doc.to_s 
+0

パーフェクトに変換することができます!おかげで – holden

+0

私はノコギリがとbodyタグを投げているように見えることに気づきました。どのようにしてそれを防ぐのか? – holden

+0

Nokogiriに入力するHTMLと、 'doc.to_s'を実行することによって得られるHTMLとの間には、しばしば若干の違いがあります。これはパーサーを通過する結果であり、私が知る限り、それを避ける方法はありません。 – mikej

0

JackChance:あなたの方法の終わりに

次のようなものを追加する必要があります元のHTMLは文書全体ではなくスニペットであったので、それは幸運をもたらしませんでした。

html = Nokogiri::HTML.fragment 最初にHTML文字列スニペットを不要なタグなしでNokogiriオブジェクトに変換しました。我々はimg.set_attributeを使用したら

その後、私たちは私が何かを見下ろす知っていた、バックhtml.to_s