Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python请求获取html?_Python_Html_Python Requests - Fatal编程技术网

使用Python请求获取html?

使用Python请求获取html?,python,html,python-requests,Python,Html,Python Requests,我正在努力教自己一些基本的网页抓取。使用Python的请求模块,我能够获取各种网站的html,直到我尝试了以下方法: >>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F') 本页的源代码不是基本的html,而是: >>> r.text '\x1f\ufffd\x08\x00\x00\x00\x0

我正在努力教自己一些基本的网页抓取。使用Python的请求模块,我能够获取各种网站的html,直到我尝试了以下方法:

>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F')
本页的源代码不是基本的html,而是:

>>> r.text
'\x1f\ufffd\x08\x00\x00\x00\x00\x00\x00\x03\ufffd]o\u06f8\x12\ufffd\ufffd\ufffd+\ufffd]...

>>> r.content
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\x9d]o\xdb\xb8\x12\x86\xef\xfb+\x88]\x14h...

我尝试了许多get/post的组合,以及从文档、SO和其他示例中可以猜到的每种语法。我不明白我在上面看到了什么,也没能把它变成任何我能读的东西,也不知道如何得到我真正想要的东西。我的问题是,如何获取上面页面的html?

相关服务器正在给您一个gzip响应。服务器也很坏;它发送以下标题:

$curl-D--o/dev/null-s-H'接受编码:gzip,deflate'http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F
HTTP/1.1200ok
日期:2015年1月6日星期二17:46:49 GMT
服务器:Apache
改变:接受编码
内容编码:gzip
内容长度:3659
内容类型:text/html
那里的
不是有效的HTTP头。因此,超过
Server
的其余标头将被忽略。服务器为什么会插话还不清楚;在所有可能的情况下,hood
WRCCWrappers.py
是一个CGI脚本,它不输出头,但在doctype行之后包含一个双换行符,将Apache服务器复制到插入附加头中

因此,
请求
也不会检测到数据是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'}
>pprint(dict(r.headers))
{'',
“连接”:“保持活动状态”,
“内容编码”:“gzip”,
“内容长度”:“3659”,
“内容类型”:“文本/html”,
“日期”:“2015年1月6日星期二17:42:06 GMT”,
“保持活动状态”:“超时=5,最大=100”,
“服务器”:“Apache”,
'vary':'Accept Encoding'}

内容编码
信息仍然存在,因此有
请求
按预期为您解码内容。

此URL的HTTP头现在已修复

>>> import requests
>>> print requests.__version__
2.5.1
>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F')
>>> r.text[:100]
u'\n<!DOCTYPE html>\n<HTML>\n<HEAD><TITLE>Monthly Average of Precipitation, Station id: 028815</TITLE></H'
>>> r.headers
{'content-length': '3672', 'content-encoding': 'gzip', 'vary': 'Accept-Encoding', 'keep-alive': 'timeout=5, max=100', 'server': 'Apache', 'connection': 'Keep-Alive', 'date': 'Thu, 12 Feb 2015 18:59:37 GMT', 'content-type': 'text/html; charset=utf-8'}
导入请求 >>>打印请求。\u版本__ 2.5.1 >>>r=请求。获取('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F') >>>r.text[:100]
u'\n\n\n降水量的月平均值,站id:028815我会用更简单的方法解决这个问题。只需导入
html
库即可解码html特殊字符:

导入html
r=请求。获取('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F')
打印(html.unescape(r.text))

在这里似乎有效,只是在Python2.7上使用了确切的url尝试了它。
test=html.fromstring(r.text)
Id强烈建议使用BeautifulSoup进行网页抓取。它会让你的生活变得简单很多。你可以使用urllib3,它和requests@vikasdumca:
请求
构建在
urllib3
之上。然而,这里的问题是服务器。是的,这是Python3的问题。每次使用时都非常有效python2@PadraicCunningham:否,这是服务器问题。Python2只是碰巧没有正确验证头部。它在Python2中工作,但是您得到了
行作为标题。@MartijnPieters:结果是,当我使用变通方法时,响应内容会由于偶尔添加额外字符而损坏,这些字符从1934年的数据开始。根据您的解释,我改为使用
zlib.decompress(r.content,16+zlib.MAX_WBITS)
解压响应内容,它似乎已经处理了所有问题。仅供参考,此URL的HTTP头现在已经修复。我为这个错误道歉。@Grant::-D不过没必要向我道歉。