2016-08-06 3 views
0

私は最初のプロジェクトをPythonで行いたいが、私はコーディングに問題がある。データを取得すると、 'ć'の代わりに '\ xc4 \ x87'のように、元の文字の代わりにコード化された文字が表示されます。コードは次のとおりです:URLを取得して、UTF-8 Pythonに変換する

import urllib.request 
import sys 

page = urllib.request.urlopen("http://olx.pl/") 
test = page.read() 

print(test) 
print(sys.stdin.encoding) 
z = "ł" 
print(z) 
print(z.encode("utf-8")) 

私はここのコードは良くないと知っていますが、私はエンコードを変更するために多くのオプションを試しました。私はz = "ł"と書いて、「特別な」文字を印刷できるかどうかを確認して表示します。私はそれをエンコードしようとしましたが、それはまた必要なように動作します。 Sys.stdin.encodingはcp852を示します。

答えて

0

urlopen()の応答から読み取ったデータは、の符号化データです。あなたは最初にデコードそのデータを適切なエンコーディングで暗号化する必要があります。

UTF-8データをダウンロードしたようですが、

test = page.read().decode('utf8') 

ただし、どのデータが受信されたかは、サーバーによって異なります。ヘッダーの文字セットを確認してください:

encoding = page.info().getparam('charset') 

これはまだNoneでもかまいません。多くのデータ形式にはの形式のエンコードが含まれています。例えばXMLは、デフォルトではUTF-8ですが、開始時のXML宣言には、その文書で使用されたコーデックに関する情報が含まれています。 XMLパーサーはその情報を抽出して、解析時にUnicodeテキストが正しくデコードされるようにします。

このデータを印刷できないことがあります。 852コードページは256種類のコードポイントしか扱えませんが、Unicode標準ははるかに大きくなります。

0

urlopenは、バイトオブジェクトを返します。つまり、生のエンコードされたバイトストリームです。 Python 3は、repr形式で、非ASCII文字のエスケープコードを使用しています。正規のユニコードを取得するには、それをデコードする必要があります。これを行う正しい方法は、ヘッダーを調べてエンコーディング宣言を探すことです。しかし、これについてはUTF-8と仮定することができ、簡単にをデコードしてとすることができます。エンコードしないでください。

import urllib.request 
import sys 

page = urllib.request.urlopen("http://olx.pl/") 
test = page.read() 
print(test.decode("utf-8")) # <- note change 

現在、Python 3のデフォルトはUTF-8ソースコードです。したがって、あなたのエディタがUnicodeをサポートし、UTF-8として保存する場合は、このように非ASCIIを埋め込むことができます。

z = "ł" 
print(z) 

端末がUTF-8エンコーディングをサポートしている場合にのみ印刷されます。 LinuxやOSXではそうですが、これは問題ではありません。

+0

ありがとうございます。それはとても簡単に見え、私は混乱しているように感じます。私は何かsimilliarを試して、それは動作しませんでした。私が言ったように私は初心者です。 –

+0

Python3でもUnicodeは難しいです。あなたが始めているのであれば、コードのコピーを手に入れることができますが、何が起こっているのかを深く理解したいときは、Ned Batchelderの「Pragmatic Unicode」や、 ? " https://www.youtube.com/watch?v=sgHbC6udIqcそれは本当に私を助けました。 – JonathanZ

0

他は正しいですが、私はより簡単なソリューションを提供したいと思います。 requestsを使用してください。これは、サードパーティ製ですので、あなたはピップを経由して、それをインストールする必要があります:

pip install requests 

しかし、それはurllibライブラリを使用するよりずっと簡単です。あなたの特定のケースでは、それは箱から出して、あなたのためのデコードを処理します。

import requests 
r = requests.get("http://olx.pl/") 
print(r.encoding) 
print(type(r.text)) 
print(r.text) 

内訳:

  • getがサーバにHTTP GETリクエストを送信し、resposeを返します。
  • We printエンコーディングrequestsテキストが入っていると思う。これはレスポンスヘッダーMartijinの言及に基づいてこれを選択する。
  • は、我々はr.textは既に復号テキストタイプ(Pythonの3中のPython 2でunicodestr
  • その後、我々は実際にprint応答であることを示しています。

我々はprintへのエンコードや種類を持っていないことに注意してください。私はちょうどrequestsが何をしているかを示すために診断目的のために行っています。 requestsは、HTTPリクエストの処理に関する他の多くの詳細を簡素化するように設計されており、うまく機能します。

関連する問題