Ответ 1
Вам просто нужно декодировать ответ, используя заголовок Content-Type
, как правило, последнее значение. Пример, приведенный в в учебнике.
output = response.decode('utf-8')
Я пытаюсь найти веб-страницу с использованием регулярных выражений, но я получаю следующую ошибку:
TypeError: нельзя использовать строковый шаблон для объекта с байтовым изображением
Я понимаю, почему, urllib.request.urlopen() возвращает байтовый поток, и поэтому, по крайней мере, я предполагаю, re не знает кодировку. Что я должен делать в этой ситуации? Есть ли способ указать метод кодирования в urlrequest, может быть, мне нужно будет перекодировать строку самостоятельно? Если да, то что я хочу сделать, я полагаю, что я должен прочитать кодировку из информации заголовка или типа кодировки, если она указана в html, а затем перекодировать ее на это?
Вам просто нужно декодировать ответ, используя заголовок Content-Type
, как правило, последнее значение. Пример, приведенный в в учебнике.
output = response.decode('utf-8')
Как и для меня, решение выглядит следующим образом (python3):
resource = urllib.request.urlopen(an_url)
content = resource.read().decode(resource.headers.get_content_charset())
У меня были те же проблемы в течение последних двух дней. У меня наконец есть решение.
Я использую метод info()
объекта, возвращаемого urlopen()
:
req=urllib.request.urlopen(URL)
charset=req.info().get_content_charset()
content=req.read().decode(charset)
С requests:
import requests
response = requests.get(URL).text
ни один из этих ответов не работает для меня в Python 3.5x с использованием urllib.request, потому что urllib.request.urlopen(url) буквально возвращает ТОЛЬКО поток байтов - он не имеет функций-членов для анализа любой формы заголовка в html. Таким образом, нет информации(), нет заголовков и т.д. Мне пришлось бы самостоятельно разобрать ее, чтобы найти кодировку, но без кодировки я не могу ее преобразовать в текст, чтобы ее разобрать. Это уловка 22.
urllib.urlopen(url).headers.getheader('Content-Type')
Выведет что-то вроде этого:
text/html; charset=utf-8
после того, как вы сделаете запрос req = urllib.request.urlopen(...)
, вы должны прочитать запрос, вызвав html_string = req.read()
, который даст вам ответ строки, который вы сможете проанализировать так, как вы хотите.