Encoding 需要从urllib2中找到与openurl()等效的请求

Encoding 需要从urllib2中找到与openurl()等效的请求,encoding,urllib2,python-requests,protocol-buffers,Encoding,Urllib2,Python Requests,Protocol Buffers,我目前正在尝试修改一个脚本,以使用请求库而不是urllib2库。我以前没有真正使用过它,我正在寻找与urlopen(“http://www.example.orgread(),所以我尝试了请求http://www.example.org“”。文本函数 这对普通的日常html很好,但是当我从这个url()获取内容时,它似乎不起作用 因此,我编写了以下代码,使用请求和urllib2库从同一url打印响应 import urllib2 import requests #urllib2 request

我目前正在尝试修改一个脚本,以使用请求库而不是urllib2库。我以前没有真正使用过它,我正在寻找与
urlopen(“http://www.example.orgread()
,所以我尝试了
请求http://www.example.org“”。文本
函数

这对普通的日常html很好,但是当我从这个url()获取内容时,它似乎不起作用

因此,我编写了以下代码,使用请求和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库。

您的问题是,您正在请求
模块将二进制内容解释为文本

来自
请求
库的响应有两种访问响应主体的主要方式:

  • -将通过TestRing以的形式返回响应主体
  • -将响应正文解码为文本并返回unicode
由于协议缓冲区是二进制格式,您应该在代码中使用
result2.content
,而不是
result2.text


响应。内容将以字节的形式返回响应正文。对于二进制内容,这正是您想要的。对于包含非ASCII字符的文本内容,这意味着服务器必须使用HTTP头或
标记指示的特定编码将内容编码到bytestring中。因此,为了理解这些字节,需要在接收后使用该字符集对它们进行解码

响应。text
现在是一种方便的方法,可以为您做到这一点。它假定响应主体是文本,并查看响应头以查找编码,然后为您解码,返回
unicode

但是,如果您的响应不包含文本,那么使用这种方法是错误的。二进制内容不包含字符,因为它不是文本,所以字符编码的整个概念对二进制内容没有任何意义——它只适用于由字符组成的文本。(这也是为什么您会看到
response.encoding==None
——它只是字节,没有涉及字符编码)


有关更多详细信息,请参阅
请求
文档中的和。

Lukas。。。我可以吻你。这是我见过的最好的解释!!这应该被移动到
请求
urlib2
的标准文档中。谢谢你,卢卡斯!!用解释性代码出色地说明了问题。这个问题不止一次地困扰着我,因为存在四个功能重叠的不兼容包:Requests、urllib、urllib2和urllib3。