Подтвердить что ты не робот

Как обрабатывать кодировку ответа из urllib.request.urlopen()

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

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

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

4b9b3361

Ответ 1

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

output = response.decode('utf-8')

Ответ 2

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

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

Ответ 3

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

req=urllib.request.urlopen(URL)
charset=req.info().get_content_charset()
content=req.read().decode(charset)

Ответ 4

С requests:

import requests

response = requests.get(URL).text

Ответ 5

ни один из этих ответов не работает для меня в Python 3.5x с использованием urllib.request, потому что urllib.request.urlopen(url) буквально возвращает ТОЛЬКО поток байтов - он не имеет функций-членов для анализа любой формы заголовка в html. Таким образом, нет информации(), нет заголовков и т.д. Мне пришлось бы самостоятельно разобрать ее, чтобы найти кодировку, но без кодировки я не могу ее преобразовать в текст, чтобы ее разобрать. Это уловка 22.

Ответ 6

urllib.urlopen(url).headers.getheader('Content-Type')

Выведет что-то вроде этого:

text/html; charset=utf-8

Ответ 7

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