2011-05-10 38 views
2

我正在使用Nokogiri解析HTML頁面,但我遇到了非破壞性空間的奇怪問題。我嘗試了不同的編碼,取代了空格,還有一些其他的頭痛誘發嘗試。如何正確處理使用Nokogiri的不間斷空間?

這裏是有問題的HTML片段:

<td>Amount 15,300&nbsp;at&nbsp;dollars</td> 

注意的&nbsp;表示改變我用引入nokogiri後:

<td>Amount 15,300&#xa0;at&#xa0;dollars</td> 

,並輸出inner_text

Amount 15,300 at dollars 

這是我的基礎Nokogiri搶,我確實嘗試了幾個替代方案來解決,但慘敗:

doc = Nokogiri::HTML(open(url)) 

然後,我有問題的項目做一個doc.search

請注意,如果我看文檔,該行會顯示&#xa0;

澄清:我認爲我沒有清楚地說明我遇到的困難。我不能讓inner_text顯示沒有奇怪的Â符號。

+1

'' 相當於' '或'' 。問題不在於nokogiri。事實上,它正在做一個很好的規範化工作。顯示它是有問題的。你在瀏覽什麼瀏覽器? – sawa 2011-05-10 21:03:21

+0

我認識到Nokogiri正在做它應該做的事情;我的問題是我試圖擺脫他們,但我所有的替換文字的嘗試都失敗了。這可能只是我試圖錯誤地使用它。我使用inner_text,然後只是輸出查看,沒有瀏覽器。 – Kraagenskul 2011-05-10 21:17:15

+0

但是,您是不是使用瀏覽器查看(呈現的結果)視圖?你還能看到它嗎? – sawa 2011-05-10 21:39:45

回答

1

除非你確實想真正保留&nbsp;表示法,否則這裏應該沒有問題。

A0是非破壞空間的十六進制字符代碼。因此,&#xa0;會打印一個不間斷的空格,與&nbsp;完全相同。 &#160;也做同樣的事情。

Nokogiri在這裏做的是讀取文本節點,識別實體,並在內部將它們轉換爲實際的字符串表示形式。然後,在將其轉換回HTML友好版本的文本節點時,它將通過其十六進制代碼表示非中斷空間,而不是在實體表中查找性能開銷,因爲它是等同的。

假設Â是您所看到的並且不只是粘貼到StackOverflow的問題,這是一個文本編碼問題:輸出軟件(瀏覽器?)不是UTF-8模式,所以不是知道如何處理字符代碼A0,盡其所能。如果這是一個瀏覽器,將<meta charset="utf-8">添加到頭部將解決此問題,並將使其餘的輸出更友好。

如果您確實想要&nbsp;,請使用gsub在您的最終輸出中替換它們。否則,不要擔心。

+0

問題是在簡單的inner_text輸出上,我試圖解析要放入數據庫的數據。我嘗試將doc.encoding設置爲utf-8(奇怪的是,我認爲我沒有嘗試過這種編碼,直到我閱讀您的回覆),但是這並沒有解決它。我認爲問題在於我沒有試圖尋找合適的角色來消除。 – Kraagenskul 2011-05-10 21:37:13

2

我知道這已經很舊了,但是花了一個小時才找到解決這個問題的方法,一旦知道了,這真的很容易。只需將你的字符串傳遞給這個函數,它就會「de-nbsp-fied」。

def strip_html(str) 
    nbsp = Nokogiri::HTML("&nbsp;").text 
    str.gsub(nbsp,'') 
end 

如果您願意,您也可以用空格替換它。可能你們許多人會找到這個答案!

0

正如@sawa所說,主要問題是您在寫入控制檯時看到的內容。在Nokogiri將它轉換爲適當的二進制值之後,它不能正確顯示非破壞空間。

的常用方法來解決這個問題是進行預處理內容:

require 'nokogiri' 

html = '<td>Amount 15,300&nbsp;at&nbsp;dollars</td>' 
doc = Nokogiri::HTML::DocumentFragment.parse(html.gsub(/&(?:#xa0|#160|nbsp);/i, ' ')) 
puts doc.to_html 

,其輸出:

<td>Amount 15,300 at dollars</td>