2012-01-06 33 views
1

我使用Nokogiri解析html。我需要頁面中的內容和圖片標籤,因此我使用inner_html而不是content方法。但由content返回的值編碼正確,而由inner_html錯誤編碼。有一點需要注意,該頁面是中文的,不使用UTF-8編碼。由Nokogiri提取的Html錯誤編碼

這裏是我的代碼:

# encoding: utf-8 
require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 
require 'iconv' 

doc = Nokogiri::HTML.parse(open("http://www.sfzt.org/advise/view.asp?id=536"), nil, 'gb18030') 

doc.css('td.font_info').each do |link| 
    # output, correct but not i expect: 目前市面上影響比 
    puts link.content 

    # output, wrong and not i expect: <img ....></img>Ŀǰ??????Ӱ??Ƚϴ?Ľ???? 
    # I expect: <img ....></img>目前市面上影響比 
    puts link.inner_html 
end 
+0

您正在使用什麼版本的Ruby的?什麼版本的Nokogiri?你的期望是什麼?當我在Ruby 1.9下運行上面的代碼時,我得到一個以「目前市面上影響比較大的講述」論文開頭的UTF-8編碼字符串。 – Phrogz 2012-01-06 18:13:52

+0

@Phrogz我使用Ruby 1.9.2;如果我使用'link.content',那是正確的(如上所述)。但除了純文本外,我還希望從頁面獲取html標籤,如img。但是這一次,它不是UTF-8編碼。它輸出類似於'Ŀǰ????????????' – Frankel 2012-01-07 01:03:05

+0

請更新您的問題,顯示如何重現和驗證問題,以及您的期望或願望代替。 – Phrogz 2012-01-08 17:33:18

回答

5

這是在 '編碼' 一節寫自述:http://nokogiri.org/

字符串總是存儲爲UTF-8內部。返回 文本值的方法將始終返回UTF-8編碼的字符串。 返回XML(如to_xml,to_html和inner_html)的方法將返回類似於源文檔編碼的字符串 。

所以,你應該轉換inner_html字符串,如果手動你想獲得它作爲UTF-8字符串:

puts link.inner_html.encode('utf-8') # for 1.9.x 
+0

它的工作原理非常感謝。 – Frankel 2012-01-10 02:45:20

1

我覺得內容剔除標籤很好,但是inner_html方法節點並沒有這樣做非常好或根本。如果你在遍歷的時候改變inner_html(它包含標籤),換句話說,如果你遍歷節點樹,你不應該做任何事情可以添加或刪除節點。「

試試這個:

doc.css('td.font_info').each do |link| 
    puts link.content 
    some_stuff = link.inner_html 
    link.children = Nokogiri::HTML.fragment(some_stuff, 'utf-8') 
end 
+1

你可能想澄清這是如何解決這個問題的。 – 2012-01-06 12:09:31

+0

@DaveNewton道歉,請參閱編輯。謝謝 – Hishalv 2012-01-06 12:55:21

+0

@Hishalv謝謝。試過你的代碼,輸出仍然是錯誤的編碼。我想知道是否需要手動進行一些編碼轉換。 – Frankel 2012-01-07 01:10:37