4
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でその文字のセットを記号に置き換える方法がわかりません'。文字列をデコードしようとしましたが、すでにUnicodeであり、上記の置換コードは何も変更しません。私が間違っていることについて何かアドバイスはありますか?

4

2 に答える 2

6

を呼び出すとcon.text()、オブジェクトが返されbytesます。これを呼び出すと、その表現str()の文字列が返されます。したがって、エンコーディングを指定しない場合は、実際の文字ではなくエスケープが使用されます。(つまり、文字列には、他のあらゆる種類の望ましくないものが含まれることになります。)ほとんどの場合、Python 2と同様です。エンコード情報は、格納されていません。Python3ではPython2と似ています。エンコーディングがあります。したがって、オブジェクトをオブジェクトに変換するときは、実際にどのエンコーディングであるかを伝える必要があります。この場合、それはです。\\xe2\\x80\\x99bytesstrstrunicodebytesstrutf-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'

ここで行われた唯一の機能変更は、bytesオブジェクトをとしてデコードするための仕様'utf-8'です。

于 2012-04-24T07:29:14.830 に答える
-1

これを試して

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

utf-8を使用していると思うので、次のようになります。

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

しかし、これはユニコードを使用する正しい理由ではありません。テキストがプログラムにインポートされたら、出力が外部の宛先を考慮する必要があるため、出力する場合を除いて、あらゆる場所でUnicodeで作業する必要があります。

スクリプトの先頭に行を追加するのが良い理由です

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

入力をutf-8として読み取ります

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

次に、newdistrict = district.replace(u "YOUR_UNICODE_STRING"、 "'")を実行します。

例えば

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

詳細については、これをお読みください

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

于 2012-04-24T07:16:17.520 に答える