Tom*_*Tom 5 encoding urllib2 protocol-buffers python-requests
我目前正在尝试修改脚本以使用 requests 库而不是 urllib2 库。我以前没有真正使用过它,我希望做相当于 的功能urlopen("http://www.example.org").read(),所以我尝试了这个requests.get("http://www.example.org").text功能。
这对于正常的日常 html 来说工作得很好,但是当我从这个 url ( https://gtfsrt.api.translink.com.au/Feed/SEQ )获取时,它似乎不起作用。
因此,我编写了以下代码,使用 requests 和 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()
Run Code Online (Sandbox Code Playgroud)
工作openurl().read()正常,但requests.get().text不适用于给定的此网址。我怀疑这与编码有关,但我不知道是什么。有什么想法吗?
注意:提供的 url 是 google 协议缓冲区格式的 feed,一旦我收到消息,我就会将该 feed 提供给解释它的 google 库。
您的问题是您使模块将响应中的二进制内容requests解释为text。
来自库的响应requests有两种主要方式来访问响应正文:
Response.content- 将以字节串形式返回响应主体 Response.text- 将响应正文解码为文本并返回unicode由于协议缓冲区是二进制格式,因此您应该result2.content在代码中使用而不是result2.text.
Response.content将按原样返回响应正文(以字节为单位)。对于二进制内容,这正是您想要的。对于包含非 ASCII 字符的文本内容,这意味着服务器必须使用由 HTTP 标头或标记指示的特定编码将内容编码为字节串<meta charset="..." />。为了理解这些字节,因此需要在接收后使用该字符集对其进行解码。
Response.textnow 是一个方便的方法,可以为您完成此操作。它假设响应正文是文本,并查看响应标头以查找编码,并为您解码,返回unicode.
但如果您的回复不包含文本,则这是错误的使用方法。二进制内容不包含字符,因为它不是文本,因此字符编码的整个概念对于二进制内容没有任何意义 - 它仅适用于由字符组成的文本。(这也是您看到的原因response.encoding == None- 它只是字节,不涉及字符编码)。
有关更多详细信息,请参阅文档中的响应内容和二进制响应内容。requests
| 归档时间: |
|
| 查看次数: |
1932 次 |
| 最近记录: |