2012-05-02 8 views
2

urllibからPython 2への変換を試しています。私は.urlopen()を使用してhtmlソースを出力できますが、.find()メソッドを使用してインデックスを作成することはできません。.find()がpython 3のurllib.request.urlopen()で動作しないのはなぜですか?

import urllib.request 
fh = urllib.request.urlopen("http://stackoverflow.com") 
html = fh.read() 
fh.close() 

print(html.find("<p>")) 

タイプエラーが発生します。私はそれがバイト配列を返すことを理解していますが、私はそれが実際に何を意味するかについてかなりあいまいです。私はデッドエンドされているいくつかの答えlike thisを試してみました。私の質問は次のとおりです:

python 3でURLのページソースを文字列として取得する簡単なネイティブメソッドはありますか?

+1

なぜ美味しいスープを使用していませんか? –

答えて

3

html.decode('utf-8')(または何らかのエンコードが使用されている)を使用して、.find()にできるstrオブジェクトを取得します。

は、フラットなバイトセットを取得し、UTF-8などの文字エンコーディングを反転して、実際のコードポイントの文字列(表示可能なシンボル)に変換するために使用されます。

+0

「どのようなエンコードが行われたとしても」は私の問題です。なぜエンコーディングを指定する必要がありますか?これはドキュメント自体に含まれていないのですか? – pdizz

+1

「時々」すべてのサーバがContent-Encodingヘッダを送信するわけではありません( 'urlopen()'で取得できるものはすべてテキストではありません)。どちらの方法でも、 'urlopen()'はそれらを処理しません。ファイルのようなオブジェクト(それに関連付けられたエンコーディングデータはありません)として生の結果を返します。 – Amber

+1

しかし、私はまた、Ignacioのコメントを2回目にしたいと思います - BeautifulSoupのようなライブラリを使用することで、ほとんどの問題は解決されますし、HTML解析を行う良い方法です。 – Amber