python - python中的urllib2.open错误
问题描述
我无法获取网址
base_url = "http://status.aws.amazon.com/"
socket.setdefaulttimeout(30)
htmldata = urllib2.urlopen(base_url)
for url in parser.url_list:
get_rss_th = threading.Thread(target=parser.get_rss,name="get_rss_th", args=(url,))
get_rss_th.start()
print htmldata
<addinfourl at 140176301032584 whose fp = <socket._fileobject object at 0x7f7d56a09750>>
指定时htmldata.read()
(使用 urllib.open 时出现 Python 错误)
然后出现黑屏
蟒蛇2.7
问题是,从 URL 链接(RSS 提要),我无法获得输出(数据)变量 data = zbx_client.recv(4096) 为空 - 无状态
解决方案
您的代码没有真正的问题(除了一堆缩进错误和显然不在您的真实代码中的语法错误),只有您尝试调试它。
首先,你这样做了:
print htmldata
这很好,但由于htmldata
它是一个urllib2
响应对象,打印它只是打印该响应对象。显然看起来像这样:
<addinfourl at 140176301032584 whose fp = <socket._fileobject object at 0x7f7d56a09750>>
这看起来不是特别有用的信息,但是当您打印仅对调试目的真正有用的东西时,您会得到这种输出。它告诉你它是什么类型的对象,它的一些唯一标识符,以及关键成员(在这种情况下,响应包装的套接字文件对象)。
然后你显然尝试了这个:
print htmldata.read()
但之前已经调用read
了同一个对象:
parser.feed(htmldata.read())
当你read()
两次使用同一个类文件对象时,第一次获取文件中的所有内容,第二次获取文件中所有内容之后的所有内容——也就是说,什么都没有。
您想要做的是read()
将内容一次放入一个字符串中,然后您可以根据需要多次重复使用该字符串:
contents = htmldata.read()
parser.feed(contents)
print contents
还值得注意的是,正如urllib2
文档在顶部所说的那样:
另请参阅建议将
Requests
包用于更高级别的 HTTP 客户端接口。
在很多方面,使用urllib2
可能是一个很大的痛苦,而这只是较小的痛苦之一。有时你不能使用requests
,因为你必须深入挖掘 HTTP 的底层,或者处理一些它不理解的协议,或者你不能安装第三方库,所以urllib2
(或者urllib.request
,因为它在 Python 3 中被重命名) .x) 仍然存在。但是,当您不必使用它时,最好不要使用它。甚至 Python 本身,在ensurepip
引导程序中,也使用requests
而不是urllib2
.
使用requests
,访问响应内容的正常方法是使用content
(对于二进制)或text
(对于 Unicode 文本)属性。您不必担心何时开始read()
;它会自动为您完成,并让您text
一遍又一遍地访问。所以,你可以这样做:
import requests
base_url = "http://status.aws.amazon.com/"
response = requests.get(base_url, timeout=30)
parser.feed(response.content) # assuming it wants bytes, not unicode
print response.text
推荐阅读
- reactjs - React - 在 React 路由器中传递数据
- code-coverage - Gcov 没有为少数类生成.gcda 文件
- user-interface - 尝试为 google 脚本 UI 警报设置超时
- sql - Do i need to add the constraint line I used in a strong entity when I'm making a create statement for a weak entity?
- c - 这个矢量化代码如何不覆盖内存?
- python - 我如何在 Python 中获得管理员权限的 UAC 提示
- emacs - 如何切换到从捕获模板创建的缓冲区?
- android - INSTALL_FAILED_UPDATE_INCOMPATIBLE:包 com.alightcreative.motion 签名与之前安装的版本不匹配;忽略
- typescript - 打字稿不能正确推断类型
- ios - 颤振项目未在IOS中运行