2011-01-17 2 views
2

HTML 문서를 파싱하고 이미지 src를 바꾸려고합니다. 그것은 내가 콘솔에서 시도 할 때 내가 원하는 것을 할 것 같지만 내 모델에서는 그것을 저장하지 않는 것 같습니다. 지금, 내가하고있는 일이 Rails에 저장하는 방법에 문제가 있는지 확신 할 수 없습니다 (콘텐츠 필드를 업데이트하고 외부 이미지를 로컬 이미지로 바꾸려고합니다) 또는 nokogiri를 사용하는 경우 저장하지 않습니다. set_attribute 방법을 사용한 결과nokogiri 바꾸기

나머지는 완벽하게 처리합니다.

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

Nokogiri가 및 body 태그를 던지고있는 것처럼 보입니다 ... 존재 여부에 관계없이. 어떻게 그 일을 막으려 는데요? – holden

+0

Nokogiri에 입력하는 HTML과'doc.to_s '를 실행하여 얻는 HTML 사이에는 약간의 차이가 있습니다. 이것은 파서를 통과 한 결과이며 피할 수있는 방법이 없다는 것을 알고 있습니다. – mikej

0

JackChance : 당신의 방법의 끝에

당신이 뭔가를 추가해야합니다 내 원본 HTML이 전체 문서 대신 스 니펫 이었기 때문에 아무런 운이 없었습니다. html = Nokogiri::HTML.fragment 처음 불필요한 태그없이 노코 기리 객체에 HTML 문자열 조각을 변환 :

나는 이런 식으로 뭔가를 사용하여 끝났다. 우리가 img.set_attribute를 사용하면

다음, 우리는 내가 뭔가를 내려다 알고 있었다, 다시 html.to_s