2011-11-12 9 views
2

私はPythonとプログラミング一般にはかなり新しいです。私はいくつかのチュートリアルを行い、かなり良い本を通して約2/3です。それは私がPythonでより快適になるように努力してきたと言われています。私は確信している奇妙な癖に、最近実行したとされているが(Pythonの3.2.2で)urllibはモジュールの私自身の間違ったまたは未「神託」使用の結果であることを私はいくつかのHTMLソースを分割するとb '(時にはb' ')が表示されます[Python]

import urllib.request 

HTML_source = urllib.request.urlopen(www.somelink.com).read() 

print(HTML_source) 
例えば

このビットは、それがsomelinkのHTMLソースを返すアクティブ通訳を介して実行されたとき、しかし、それはBとそれを接頭辞」

b'<HTML>\r\n<HEAD> (etc). . . . 

私は空白で、リストに文字列を分割する場合、それはすべての項目を接頭辞b '

私は本当にstd libに慣れさせようとしている何かを達成しようとはしていません。なぜこのb 'がプレフィックスになっているのか知りたいのですが

ボーナス - サードパーティのモジュールを使用せずにHTMLソースを取得するには、より良い方法がありますか?ホイールを再発明しないことについてジャズを知っていますが、私は自分のツールを構築することで学ぶことを試みています。

ありがとうございました!

答えて

7

"b"接頭辞は、タイプがバイトではなく、strであることを意味します。バイトをテキストに変換するには、デコードメソッドを使用し、適切なエンコーディングに名前を付けます。エンコーディングは、しばしば「コンテンツタイプ」ヘッダーで発見された:あなたは、ヘッダー内のエンコーディングが見つからない場合は

>>> u = urllib.request.urlopen('http://cnn.com') 
>>> u.getheader('Content-Type') 
'text/html; charset=UTF-8' 
>>> html = u.read().decode('utf-8') 
>>> type(html) 
<class 'str'> 

、デフォルトとしてUTF-8を試してみてください。

2

b''はリテラルバイトオブジェクトです。メモリにはb''オブジェクトはなく、bytesのみです。これは、ソースコード内のバイトオブジェクトの表記に過ぎません。ソースコード内の平らな引用符''は 'str'オブジェクト(Unicode文字列)を作成します。

bytesオブジェクトがテキスト(イメージなどのバイナリデータではありません)を表す場合、通常はできるだけ早くUnicode文字列にデコードする必要があります。 You should know the character encoding of the text

lxml.html,BeautifulSoupなどのHTMLパーサーは、ユーザーの介入なしにバイトをUnicodeに変換できます。

エンコーディングがわからない場合は、それを検出するのは簡単ではない場合があります(例:how feedparser detects character encoding [2006])。

関連する問題