2012-04-24 12 views
3
import urllib.request as u 

zipcode = str(47401) 
url = 'http://watchdog.net/us/?zip=' + zipcode 
con = u.urlopen(url) 

page = str(con.read()) 
value3 = int(page.find("<title>")) + 7 
value4 = int(page.find("</title>")) - 15 
district = str(page[value3:value4]) 
print(district) 
newdistrict = district.replace("\xe2\x80\x99","'") 
print(newdistrict) 

何らかの理由で、私のコードは、次の形式でタイトルを取得しています:IN-09: Indiana\xe2\x80\x99s 9th。私は\xe文字列が'シンボルのユニコードであることを知っていますが、どのようにしてその文字セットを'シンボルで置き換えるかを知ることはできません。私は文字列をデコードしようとしましたが、すでにUnicodeであり、上記の置換コードは何も変更しません。私が間違ってやっていることに関するアドバイスは?Pythonがこのテキストを正しく表示しないのはなぜですか? (UTF-8デコードの問題)

+0

あなたは 'ユニコード 'リテラルを使ってみましたか? –

+0

あなたはそれが何を意味しているかについて完全にはわかりません、もう少し情報を提供できますか? – user1353035

+0

それは '' 'ではなく、' ''(U + 2019、右一重引用符)です。 –

答えて

4

これを読んで、これはbytesオブジェクトを返します。 str()を呼び出すとという表現の文字列が返されます。エンコーディングを指定しないと、実際の文字ではなくエスケープが使用されます。 (つまり、文字列には\\xe2\\x80\\x99とその他の望ましくないものが含まれていることになります)bytesはPython 2ではほとんどstrに似ています。エンコード情報は格納されていません。 Python 3のstrは、Python 2ではunicodeと同じです。それはエンコーディングを持っています。したがって、bytesオブジェクトをstrオブジェクトに変換するときは、実際にどのエンコーディングがあるかを伝える必要があります。この場合は、utf-8です。

str()を呼び出す代わりに、bytes.decodeを使用することをお勧めします。それは同じことです、ほんのちょっとだけ。

>>> import urllib.request as u 
>>> zipcode = 47401 
>>> url = 'http://watchdog.net/us/?zip={}'.format(zipcode) 
>>> con = u.urlopen(url) 
>>> page = con.read().decode('utf-8') 
>>> page[page.find("<title>") + 7:page.find("</title>") - 15] 
'IN-09: Indiana’s 9th' 

ここでなされたものであり、唯一の機能的変化が'utf-8'としてbytesオブジェクトをデコードする仕様です。

+0

助けてくれてありがとうございました。私は当初、次のようなものを使ってファイルをデコードしようとしました: page = con.read() newpage = page.decode( 'utf-8') ここに空白のページがあります。それから、私はデコードラインを削除することでソースコードを返すことができることを発見しました。何が起こっていたかわからない、あなたの助けをもう一度感謝します。 :) – user1353035

+0

基本的に 'str(b '\ xab')'は ''\ xab'の代わりに' 'b '\\ xab'" 'を生成します(' repr(b ' \ xab ')、エンコーディングを指定せずに意味のある変換がないためです)。 –

0

は、私はあなたがそう、それはこの

newdistrict = district.encode("utf-8").replace("\\xe2\\x80\\x99","'") 

ように見えるshoudが、ユニコードで動作するように、なぜこれが正しくないUTF-8を使用していると思います。この

newdistrict = district.encode("**THE_INPUT_STRING_ENCODING**").replace("\\xe2\\x80\\x99","'") 

を試してみてください。あなたのテキストをプログラムにインポートされると は、あなたが出力として出力する外部の先

を検討する必要があるとき多分以外のすべての場所 上でUnicodeで動作するはずですので、より良い理由をあなたのスクリプトの先頭に行を追加することです

# -*- coding: utf-8 -*- 

がUTF-8

page = con.read().decode('utf-8') 

としてあなたの入力を読み、 newdistrict = district.replace(U」YOUR_UNICODEを行いますあなたがcon.text()を呼び出すときの例より多くの助けのための

newdistrict = district.replace(u"דכעדחלגעדיל","'") 

ため_string」、 "'")

http://docs.python.org/howto/unicode.html

+0

あなたの答えは彼が扱っているPython 3だから正しいものではありません。 –

関連する問題