Ответ 1
Сервер, о котором идет речь, дает вам ответ gzipped. Сервер также очень сломан; он отправляет следующие заголовки:
$ curl -D - -o /dev/null -s -H 'Accept-Encoding: gzip, deflate' http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2015 17:46:49 GMT
Server: Apache
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"><html xmlns="http: //www.w3.org/1999/xhtml" lang="en-US">
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3659
Content-Type: text/html
Строка <!DOCTYPE..>
содержит не допустимый HTTP-заголовок. Таким образом, оставшиеся заголовки Server
игнорируются. Почему сервер не вмешивается, что неясно; во всех возможных капюшонах WRCCWrappers.py
есть CGI script, который не выводит заголовки, но включает двойную новую строку после строки doctype, дублируя сервер Apache, добавляя туда дополнительные заголовки.
Таким образом, requests
также не обнаруживает, что данные кодируются gzip. Все данные есть, вам просто нужно его расшифровать. Или вы могли бы, если бы это было не совсем неполно.
Обход - это сказать серверу не беспокоить сжатие:
headers = {'Accept-Encoding': 'identity'}
r = requests.get(url, headers=headers)
и возвращается несжатый ответ.
Кстати, на Python 2 анализатор HTTP-заголовков не так строг и ему удается объявить doctype заголовком:
>>> pprint(dict(r.headers))
{'<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "dtd/xhtml1-transitional.dtd"><html xmlns="http': '//www.w3.org/1999/xhtml" lang="en-US">',
'connection': 'Keep-Alive',
'content-encoding': 'gzip',
'content-length': '3659',
'content-type': 'text/html',
'date': 'Tue, 06 Jan 2015 17:42:06 GMT',
'keep-alive': 'timeout=5, max=100',
'server': 'Apache',
'vary': 'Accept-Encoding'}
и сохраняется content-encoding
информация, поэтому requests
декодирует контент для вас, как и ожидалось.