需要从 urllib2 中找到等同于 openurl() 的请求

Need to find the requests equivalent of openurl() from urllib2

我目前正在尝试修改脚本以使用请求库而不是 urllib2 库。我以前没有真正使用过它,我希望做相当于 urlopen("http://www.example.org").read() 的事情,所以我尝试了 requests.get("http://www.example.org").text 功能。

这在日常生活中正常工作 html,但是当我从这个 url (https://gtfsrt.api.translink.com.au/Feed/SEQ) 中获取时,它似乎不起作用。

所以我写了下面的代码来使用请求和 urllib2 库打印出来自同一个 url 的响应。

import urllib2
import requests

#urllib2 request
request = urllib2.Request("https://gtfsrt.api.translink.com.au/Feed/SEQ")
result = urllib2.urlopen(request)

#requests request
result2 = requests.get("https://gtfsrt.api.translink.com.au/Feed/SEQ")
print result2.encoding

#urllib2 write to text
open("Output.txt", 'w').close()
text_file = open("Output.txt", "w")
text_file.write(result.read())
text_file.close()

open("Output2.txt", 'w').close()
text_file = open("Output2.txt", "w")
text_file.write(result2.text)
text_file.close()

openurl().read() 工作正常,但 requests.get().text 不适用于给定的 url。我怀疑它与编码有关,但我不知道是什么。有什么想法吗?

注意:提供的 url 是 google 协议缓冲区格式的提要,一旦我收到消息,我就会将提要提供给解释它的 google 库。

您的问题是您正在让 requests 模块将响应中的 二进制内容 解释为 文本

来自 requests 库的响应有两种访问响应的 body 的主要方式:

由于协议缓冲区是二进制格式,您应该在代码中使用 result2.content 而不是 result2.text


Response.content 将 return 响应 as-is 的 body,以 字节 。对于二进制内容,这正是您想要的。对于包含 non-ASCII 个字符的文本内容,这意味着该内容必须已由服务器使用由 HTTP header 或 <meta charset="..." /> 标记指示的特定编码编码为字节串。因此,为了理解这些字节,在使用该字符集接收后需要对其进行 解码

Response.text 现在是一种方便的方法,可以为您做到这一点。它假定响应 body 是文本,并查看响应 headers 以找到编码,并为您解码,returning unicode .

但是,如果您的回复不包含文本,则此方法使用不当。二进制内容不包含字符,因为它不是文本,所以 character 编码的整个概念对二进制内容没有任何意义——它只适用于由字符组成的文本。 (这也是您看到 response.encoding == None 的原因 - 它只是字节,不涉及 字符 编码)。

有关详细信息,请参阅 requests 文档中的 Response Content and Binary Response Content