2011-02-13 2 views
28

Я пытаюсь искать веб-страницы, используя регулярные выражения, но я получаю следующее сообщение об ошибке:Как обрабатывать кодирование ответа от urllib.request.urlopen()

TypeError: can't use a string pattern on a bytes-like object

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

ответ

35

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

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

Спасибо, вот что мне нужно. – kryptobs2000

+9

Что делать, если кодировка не является utf-8? Было бы лучшей идеей как-то определить это из ответа вместо жесткого кодирования этого предположения? –

0

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

+1

Я делаю, вот как я его получаю, но он возвращает bytesteam, b ' ...'. – kryptobs2000

+0

Я вижу, то вы можете использовать '.decode()', как указал @Senthil, или вы можете использовать urllib2, который должен прозрачно обращаться с вами. –

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

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

text/html; charset=utf-8

57

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

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

Похоже, лучший ответ, но что, если сервер не отправит информацию о кодировке? – rvighne

+0

Если сервер не отправляет информацию о кодировке, лучшим вариантом в этом случае является угадать. – Iguananaut

+8

@rvighne: если сервер не передает 'charset' в заголовке Content-Type, тогда [существуют сложные правила для определения кодировки символов] (https://blog.whatwg.org/the-road-to -html-5-character-encoding), например, он может быть указан внутри html-документа: ''. – jfs

5

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

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

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

Смежные вопросы