2016-02-01 1 views
2

Я попытался разбора веб-страницу с помощью urllib.request «s urlopen() метод, как:urllib.request.urlopen вернуть байт, но я не могу расшифровать это

from urllib.request import Request, urlopen 
req = Request(url) 
html = urlopen(req).read() 

Однако, последняя строка возвращается результат в байтах.

Так что я попытался его расшифровкой, как:

html = urlopen(req).read().decode("utf-8") 

Однако произошла ошибка:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte.

С некоторыми исследованиями, я нашел one related answer, который разбирает charset решить декодирование. Тем не менее, страница не возвращает набор символов, и когда я попытался проверить его на Chrome Web Inspector, следующая строка была написана в заголовке:

<meta charset="utf-8"> 

Так почему я не могу расшифровать его с utf-8? И как я могу проанализировать веб-страницу успешно?

URL-адрес веб-сайта: http://www.vogue.com/fashion-shows/fall-2016-menswear/fendi/slideshow/collection#2, где я хочу сохранить изображение на своем диске.

Обратите внимание, что я использую Python 3.5.1. Я также отмечаю, что вся работа, которую я написал выше, хорошо функционировала в других моих программах очистки.

ответ

5

Содержимое сжимается gzip. Вы должны распаковать его:

import gzip 
from urllib.request import Request, urlopen 

req = Request(url) 
html = gzip.decompress(urlopen(req).read()).decode('utf-8') 

Если вы используете requests, он распаковывается автоматически для вас:

import requests 
html = requests.get(url).text # => str, not bytes 
+1

Спасибо. Можете ли вы поделиться, как вы можете узнать, что это gzip? – Blaszard

+0

@Blaszard дубликат имеет то, что –

+1

@Blaszard, 'urlopen (req) .info() ['content-encoding']' – falsetru