首页 > 解决方案 > 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

整个代码:https ://github.com/tech-sketch/zabbix_aws_template/blob/master/scripts/AWS_Service_Health_Dashboard.py

问题是,从 URL 链接(RSS 提要),我无法获得输出(数据)变量 data = zbx_client.recv(4096) 为空 - 无状态

标签: pythonurl

解决方案


您的代码没有真正的问题(除了一堆缩进错误和显然不在您的真实代码中的语法错误),只有您尝试调试它。


首先,你这样做了:

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

推荐阅读