web-dev-qa-db-ja.com

urllib.request.urlopen()からのエンコードを処理する方法

正規表現を使用してWebページを検索しようとしていますが、次のエラーが表示されます。

TypeError:バイトのようなオブジェクトでは文字列パターンを使用できません

Urllib.request.urlopen()がバイトストリームを返す理由を理解しているので、少なくとも推測では、使用するエンコーディングがわかりません。この状況で私は何をすべきでしょうか? urlrequestでエンコード方法を指定する方法はありますか、それとも自分で文字列を再エンコードする必要がありますか?もしそうなら、私は何をしようとしているのか、ヘッダー情報からエンコードを読み取るか、HTMLで指定されている場合はエンコードタイプを読み取ってからそれを再エンコードする必要があると思いますか?

40
kryptobs2000

通常は最後の値であるContent-Typeヘッダーを使用して、応答をデコードするだけです。 チュートリアル にも例があります。

output = response.decode('utf-8')
40
Senthil Kumaran

私にとっては、解決策は次のとおりです(python3):

resource = urllib.request.urlopen(an_url)
content =  resource.read().decode(resource.headers.get_content_charset())
79
Ivan Klass

requests の場合:

import requests

response = requests.get(URL).text
8
xged

私は過去2日間同じ問題を抱えていました。私は最終的に解決策を持っています。私はinfo()によって返されるオブジェクトのurlopen()メソッドを使用しています:

req=urllib.request.urlopen(URL)
charset=req.info().get_content_charset()
content=req.read().decode(charset)
6
pytohs
urllib.urlopen(url).headers.getheader('Content-Type')

このようなものを出力します:

text/html; charset=utf-8

0
wynemo