首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要从urllib2找到相当于openurl()的请求

需要从urllib2找到相当于openurl()的请求
EN

Stack Overflow用户
提问于 2015-07-08 10:48:34
回答 1查看 1.7K关注 0票数 5

目前,我正在尝试修改一个脚本,以使用请求库而不是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输出响应。

代码语言:javascript
复制
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库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-08 11:54:47

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

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

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

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

Response.text现在是一种方便的方法,它可以为您提供准确的服务。它假设响应体是文本,并查看响应头以找到编码,并为您解码,返回unicode.。

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

有关详细信息,请参阅响应内容二进制响应内容文档中的requests文档。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31290445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档