encoding - 需要从 urllib2 中找到相当于 openurl() 的请求

标签 encoding urllib2 python-requests protocol-buffers

我目前正在尝试修改脚本以使用 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()
openurl().read()工作正常,但 requests.get().text不适用于给定的此网址。我怀疑它与编码有关,但我不知道是什么。有什么想法吗?

注意:提供的 url 是谷歌 Protocol Buffer 格式的提要,一旦我收到消息,我会将提要提供给解释它的谷歌库。

最佳答案

您的问题是您正在制作 requests模块解释 二进制内容 回复为 文字 .

来自 requests 的回复库有两种访问响应正文的主要方式:

  • Response.content - 将响应正文作为 返回字节串
  • Response.text - 将响应正文解码为文本并返回 统一码

  • 由于 Protocol Buffer 是二进制格式,您应该使用 result2.content在您的代码中,而不是 result2.text .

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

    Response.text now 是一种方便的方法,可以为您做到这一点。它假定响应正文是文本,并查看响应 header 以查找编码,并为您解码,返回 unicode .

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

    Response ContentBinary Response Contentrequests文档以获取更多详细信息。

    关于encoding - 需要从 urllib2 中找到相当于 openurl() 的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31290445/

    相关文章:

    python - 对于从 Python 向网站发送请求有什么建议吗?

    python - urllib2.Request post 相当于node.js

    python - 几次调用后,通过代理的 urllib2.urlopen 失败

    python - pytest:如何在单元测试期间强制引发异常?

    python - 如何从 flask 发送和接收数据?

    java - 如何使用正确的编码将所有控制台输出重定向到 Swing JTextArea/JTextPane?

    python - '# -*- coding: utf-8 -*-' 也是 Python 中的注释吗?

    c# - 智能 HTML 编码

    iphone - iOS 5 如何录制 FLAC 或从 CAFF 编码为 FLAC

    python - 是否可以在请求中刷新 session ?