2013-07-23 39 views
3

我是編程新手,我正在編寫Ruby 1.9.3中的一個小練習程序,它使用Nokogiri以郵政編碼查詢加拿大議會網站,然後打印相應的議會成員名稱和他們騎馬到碼頭。如何將Nokogiri-scraped HTML以UTF-8形式輸出到終端?

我的代碼獲取頁面並隔離MP的名稱/騎行很好,但在shell中將UTF-8字符顯示爲純ASCII。我想要顯示UTF-8字符。

我知道殼可以UTF-8,因爲處理:

irb> riding = "St-Jérôme" 
=> "St-Jérôme" 
irb> puts riding 
St-Jérôme 
=> nil 

的代碼我用來抓取網頁:

page = Nokogiri::HTML(open("http://parl.gc.ca/ParlInfo/Compilations/HouseOfCommons/MemberByPostalCode.aspx?PostalCode=#{postalcode}")) 

這是該代碼返回時的樣品I型puts page

<span id="ctl00_cphContent_repMP_ctl00_grdConstituencyAddress_ctl02_Label12">St-J&Atilde;&copy;r&Atilde;&acute;me</span> 

所以 「St-Jérôme」 變成了「St-J&Atilde;&copy;r&Atilde;&acute;me「,或在終端中輸入」St-J&Atilde;&copy;r&Atilde;&acute;me「。

也許有一種方法來轉換它,而它被存儲爲一個字符串變量?或者,也許我可以在Nokogiri中設置一個選項,將其作爲UTF-8而不是ASCII進行設置?

我搜索了很長時間纔在Google和Stack Overflow上找到答案,並且沒有找到任何相關或我理解的內容;再一次,我對此很新穎。如果這是重複的,請指向正確的方向。

非常感謝。

+0

我們需要更多/更好的信息。什麼是您使用的郵政編碼?我們需要您使用的代碼樣本,不僅僅是檢索URL,而是您想要的標籤。請參閱http://sscce.org/ –

回答

7

嘗試

page = Nokogiri::HTML(open("http://parl.gc.ca/ParlInfo/Compilations/HouseOfCommons/MemberByPostalCode.aspx?PostalCode=#{postalcode}"), nil, "UTF-8") 

代替。這應該將頁面解析爲UTF-8並解決問題。

+0

非常感謝,完美的工作! – Nicholas

+0

你讓我的一天 – aherve

+0

Wooow,worku完美!謝謝! –

4

@BadgerPriest有答案。原因如下:檢查來源Nokogiri::HTML::Document.parse

Nokogiri依賴於LibXML2來處理解析,但是LibXML2並沒有很好地確定被解析文檔的正確字符編碼。 Nokogiri punts,默認爲ASCII-8bit,這會導致多字節字符被破壞。

通過強制編碼爲UTF-8,Nokogiri符合頁面的編碼,並且能夠正確返回和/或顯示字符。

當涉及到匹配內部實際有效載荷的編碼時,HTML頁面是一個真正的混合包。看到與實際字符無關的編碼是很常見的,所以我們經常不得不告訴Nokogiri將HTML解釋爲什麼。這很醜陋,但它是互聯網對傳統HTML「財富」的狀態。

+0

感謝您的解釋。一位程序員朋友告訴我,我應該學習使用Nokogiri,並且一直在發現這些文檔有點難以理解 - 我對HTML/CSS/XML也是比較陌生的,但這並沒有幫助。我感謝您花時間爲我解釋它。 – Nicholas

+0

是的,Nokogiri是一個了不起的工具,一旦你很容易解析和查找,你會想知道爲什麼有人會用任何其他方法處理XML/HTML。通過一個正則表達式處理幾乎是比較原始的。 –