2016-05-08 50 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に文字として表示する方法を理解することはできませんでした。

私は他の場所で答えを見つけようとしました。ポイントについてより明確にした質問だったこの1:追加提案 Python and BeautifulSoup encoding issues

しかし私のコメントに記載されている同じエラー( "はAttributeError与えた

soup = BeautifulSoup.BeautifulSoup(content.decode('utf-8','ignore')) 

:型オブジェクトのBeautifulSoup」を2番目の '.BeautifulSoup'を削除すると、別のエラーが発生しました( "RuntimeError:Pythonオブジェクトの呼び出し中に最大再帰深度を超えました")。オブジェクト

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

の作成を壊すことで Chinese character encoding error with BeautifulSoup in Python?

が、それはまた、再帰エラーが発生した:

私も答えはここに提案してみました。他のヒントがあれば幸いです。

おかげ

答えて

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")) 
环境污染最小化 资源利用最大化 

if BS4 4.4を使用して私のために

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

:あなたは、データがUTF-8エンコードで見ることができ、ソースを見てください。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) 
环境污染最小化 资源利用最大化 

あなたはUTF-8 STRエンコードデータになるでしょうcsvファイルに書いている:

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

あなたはあなたの辞書にデータを保存するときにエンコードを行うことができます。

+0

ああ、これはとても近いです!これは、そのデータが正しいことを希望するテキストを印刷するために働く。しかし、辞書に追加しようとすると、ユニコードに戻りました。 g = soup.h3.text.encode( "utf-8")。decode( "unicode-escape") 'と' print(g) 'のようにステップ9を少し壊しました。それはうまくいった。しかし、holder: 'holder [" key "] = g'という辞書にgを追加しようとしたときに、' print holder'がユニコード出力をもう一度得ました。最終的に私は辞書をCSVに出力したいのですが、それがチェーンを通じて正しいことを確認したいのです。 – user5356756

+0

@ user5356756、それはちょうどreprの表現ですhttp://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python、dictから値そのものを印刷してみてください。また、答えの終わりに応じて、あなたは本当に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

D'oh、他の人がこれをよりよく記憶しているのを見てよかった! –

関連する問題