2016-05-08 100 views
4

我想識別並保存所有的標題在一個特定的網站,並不斷得到我認爲是編碼錯誤。BeautifulSoup漢字編碼錯誤

該網站是:http://paper.people.com.cn/rmrb/html/2016-05/06/nw.D110000renmrb_20160506_2-01.htm

當前的代碼是:

holder = {} 

url = urllib.urlopen('http://paper.people.com.cn/rmrb/html/2016-05/06/nw.D110000renmrb_20160506_2-01.htm').read() 

soup = BeautifulSoup(url, 'lxml') 

head1 = soup.find_all(['h1','h2','h3']) 

print head1 

holder["key"] = head1 

打印的輸出是:

[<h3>\u73af\u5883\u6c61\u67d3\u6700\u5c0f\u5316 \u8d44\u6e90\u5229\u7528\u6700\u5927\u5316</h3>, <h1>\u5929\u6d25\u6ee8\u6d77\u65b0\u533a\uff1a\u697c\u5728\u666f\u4e2d \u5382\u5728\u7eff\u4e2d</h1>, <h2></h2>] 

我有理由相信這些都是Unicode字符,但我一直無法弄清楚如何說服python將它們顯示爲字符。

我試圖在別處找到答案。這是更清楚點這個問題是一個: Python and BeautifulSoup encoding issues

其建議增加

soup = BeautifulSoup.BeautifulSoup(content.decode('utf-8','ignore')) 
但是這給了我,在留言中提到了同樣的錯誤(「AttributeError的

:對象類型‘BeautifulSoup’沒有屬性'BeautifulSoup'「) 刪除第二個'.BeautifulSoup'導致了不同的錯誤(」RuntimeError:調用Python對象時超出最大遞歸深度「)。

我也試過了答案這裏建議: Chinese character encoding error with BeautifulSoup in Python?

通過破壞對象

html = urllib2.urlopen("http://www.515fa.com/che_1978.html") 
content = html.read().decode('utf-8', 'ignore') 
soup = BeautifulSoup(content) 

的創建,但也產生了遞歸誤差。任何其他提示將不勝感激。

感謝

回答

3

解碼使用unicode-escape

In [6]: from bs4 import BeautifulSoup 

In [7]: h = """<h3>\u73af\u5883\u6c61\u67d3\u6700\u5c0f\u5316 \u8d44\u6e90\u5229\u7528\u6700\u5927\u5316</h3>, <h1>\u5929\u6d25\u6ee8\u6d77\u65b0\u533a\uff1a\u697c\u5728\u666f\u4e2d \u5382\u5728\u7eff\u4e2d</h1>, <h2></h2>""" 

In [8]: soup = BeautifulSoup(h, 'lxml') 

In [9]: print(soup.h3.text.decode("unicode-escape")) 
環境污染最小化 資源利用最大化 

如果你看看源,你可以看到的數據是UTF-8編碼

<meta http-equiv="content-language" content="utf-8" /> 

對我來說,使用BS4 4.4。1剛剛解碼的urllib返回什麼工作也未嘗不可:

In [1]: from bs4 import BeautifulSoup 

In [2]: import urllib 

In [3]: url = urllib.urlopen('http://paper.people.com.cn/rmrb/html/2016-05/06/nw.D110000renmrb_20160506_2-01.htm').read() 

In [4]: soup = BeautifulSoup(url.decode("utf-8"), 'lxml') 

In [5]: print(soup.h3.text) 
環境污染最小化 資源利用最大化 

當你寫一個CSV你將要編碼數據到UTF-8 STR

.decode("unicode-escape").encode("utf-8") 

將字典中的數據保存時,可以進行編碼。

+0

哦,這個人太親近了!這用於打印文本,這讓我希望這些數據是正確的。但是,當我試圖將其添加到字典時,它恢復爲unicode。我分解了第9步,所以'g = soup.h3.text.encode(「utf-8」)。decode(「unicode-escape」)'然後'print(g)'。這工作得很好。但是當我試圖將g添加到名爲holder的字典時:'holder [「key」] = g'然後是'print holder',我又得到了unicode輸出。最終我想輸出字典到CSV,我想確保它是正確的通過鏈。 – user5356756

+0

@ user5356756,這只是repr表示http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python,嘗試從字典打印值本身,你應該看到相同的。也根據答案的結尾,你應該真正升級到bs4 –

+0

gotcha,謝謝!這樣可行。使用dictwriter將字典轉移到csv時遇到了麻煩,但這遠遠超出了這個問題的範圍,因此我會做一些研究並在需要時開放一個新的研究。至於bs4,我的腳本的第一行(我沒有在上面重現)是'from bs4 import BeautifulSoup'。爲了從3切換到4,我還需要做些什麼嗎? – user5356756

0

這可以提供一個非常簡單的解決方案,不知道它絕對一切你需要它雖然,讓我知道:

holder = {} 

url = urllib.urlopen('http://paper.people.com.cn/rmrb/html/2016-05/06/nw.D110000renmrb_20160506_2-01.htm').read() 

soup = BeautifulSoup(url, 'lxml') 

head1 = soup.find_all(['h1','h2','h3']) 

print unicode(head1) 

holder["key"] = head1 

參考:Python 2.7 Unicode

+0

謝謝!不幸的是,這給了我以前的完全相同的輸出,所以我仍然得到了u1234而不是字符。 – user5356756

+0

噢,很高興看到別人對此有更好的記憶! –