【发布时间】:2012-04-04 02:05:32
【问题描述】:
我的代码卡在这个函数调用上:
feedparser.parse("http://...")
这以前有效。该网址甚至无法在浏览器中打开。 你将如何治愈这种情况?有超时的可能吗?我想继续,好像什么都不会发生(仅打印一些消息或记录此问题)
【问题讨论】:
标签: python feedparser
我的代码卡在这个函数调用上:
feedparser.parse("http://...")
这以前有效。该网址甚至无法在浏览器中打开。 你将如何治愈这种情况?有超时的可能吗?我想继续,好像什么都不会发生(仅打印一些消息或记录此问题)
【问题讨论】:
标签: python feedparser
您可以使用socket.setdefaulttimeout() 全局指定超时。
超时可能会限制单个套接字操作的持续时间——feedparser.parse() 可能会执行许多套接字操作,因此花费在 dns、建立 tcp 连接、发送/接收数据的总时间可能会更长。见Read timeout using either urllib2 or any other http library。
【讨论】:
使用 Python requests 库进行网络 IO,feedparser 仅用于解析:
# Do request using requests library and timeout
try:
resp = requests.get(rss_feed, timeout=20.0)
except requests.ReadTimeout:
logger.warn("Timeout when reading RSS %s", rss_feed)
return
# Put it to memory stream object universal feedparser
content = BytesIO(resp.content)
# Parse content
feed = feedparser.parse(content)
【讨论】:
requests.get() 可能阻塞的时间比timeout 值长得多)。点击链接了解详情。
根据作者的建议[1],你应该使用requests库来做http请求,并将结果解析到feedparser。
【讨论】: