Как обработать кодировку ответа от urllib.request.urlopen () - PullRequest
39 голосов
/ 13 февраля 2011

Я пытаюсь найти веб-страницу с помощью регулярных выражений, но получаю следующую ошибку:

TypeError: не могу использовать строковый шаблон в байтовоподобном объекте

Я понимаю, почему urllib.request.urlopen () возвращает байтовый поток, и поэтому, по крайней мере, я предполагаю, что он не знает, какую кодировку использовать.Что я должен делать в этой ситуации?Есть ли способ указать метод кодирования в urlrequest, может быть, или мне нужно будет перекодировать строку самостоятельно?Если так, что я хочу сделать, я предполагаю, что должен прочитать кодировку из информации заголовка или тип кодировки, если он указан в html, а затем перекодировать его в это?

Ответы [ 6 ]

79 голосов
/ 03 октября 2013

Что касается меня, решение выглядит следующим образом (python3):

resource = urllib.request.urlopen(an_url)
content =  resource.read().decode(resource.headers.get_content_charset())
40 голосов
/ 13 февраля 2011

Вам просто нужно декодировать ответ, используя заголовок Content-Type, как правило, последнее значение.В есть пример, приведенный в учебнике .

output = response.decode('utf-8')
7 голосов
/ 28 апреля 2016

С запросами :

import requests

response = requests.get(URL).text
6 голосов
/ 17 ноября 2015

У меня были те же проблемы за последние два дня. У меня наконец есть решение. Я использую info() метод объекта, возвращаемого urlopen():

req=urllib.request.urlopen(URL)
charset=req.info().get_content_charset()
content=req.read().decode(charset)
0 голосов
/ 01 декабря 2011
urllib.urlopen(url).headers.getheader('Content-Type')

Будет выводить что-то вроде этого:

text/html; charset=utf-8

0 голосов
/ 13 февраля 2011

после того, как вы сделаете запрос req = urllib.request.urlopen(...), вы должны прочитать запрос, позвонив по номеру html_string = req.read(), который даст вам строковый ответ, который вы затем сможете проанализировать так, как хотите.

...