我需要定期访问和解析来自以下形式的网站的XML数据:
https://api.website.com/stuff/getCurrentData?security_key=blah
由于数据的安全性,我无法发布实际连接。当我将这个url放入浏览器(Safari)时,我会返回XML。
当我通过urllib2调用它时,我得到了垃圾。
f = urllib2.urlopen("https://api.website.com/stuff/getCurrentData?security_key=blah")
s = f.read()
f.close()
s
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xc5\x96mo\xda0\x10\xc7\xdf\xf7SX\xbc\xda4\x15\xc7y\x00R\xb9\xae\xfa\xb4U\x1a-\x150M{5y\xe1\x06V\x13\x079\x0e\x14>\xfd\x9c\x84\xb0\xd2\xa4S\xa4L\xe5\x95\xef\xeeo
这篇文章Urllib's urlopen breaking on some sites (e.g. StackApps api): returns garbage results似乎是一个类似的问题,但它指的是JSON而不是XML。按照查看标题的说明,我认为我正在返回GZIP数据。 {我做了测试建议,发布在这里}
req = urllib2.Request("https://api.website.com/stuff/getCurrentData?security_key=blah",
headers={'Accept-Encoding': 'gzip, identity'})
conn = urllib2.urlopen(req)
val = conn.read()
conn.close()
val[0:25]
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xc5\x96]o\xda0\x14\x86\xef\xfb+,\xae6M'
在那篇文章中,有人提出这可能是一个本地问题,所以我尝试了一个示例网站。
f = urllib2.urlopen("http://www.python.org")
s = f.read()
f.close()
s
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n <meta http-equiv="content-type" content="text/html; charset=utf-8" />\n <title>Python Programming Language – Official Website</title>\n
这很好用,所以我认为它与我实际尝试访问的网站API有关。
这篇文章Why does text retrieved from pages sometimes look like gibberish?表明我可能需要对“Selenium”做点什么,但后来海报说问题“修复了”,这无法帮助我找出问题所在。
我无法使用python下载安全数据吗? 除了urlib2和url之外,我还需要使用其他不同的东西吗?
我在Mac OSX 10.7.5上运行python 2.7
答案 0 :(得分:2)
您正在检索GZIPped压缩数据;服务器明确告诉你它与Content-Encoding: gzip
有关。使用zlib
库来解压缩数据:
import zlib
decomp = zlib.decompressobj(16 + zlib.MAX_WBITS)
data = decomp.decompress(val)
或使用支持透明解压缩的库,如果响应标头指示已使用压缩,例如requests
。
答案 1 :(得分:1)
'\x1f\x8b\'
确实是gzip的神奇标头,所以你得到了gzip数据。
在您的第二个示例中,您明确接受gzip编码数据,将其更改为'Accept-Encoding': 'identity'
并查看它是否有所作为。