feedparser 超时

问题描述 投票:0回答:4

我的代码卡在这个函数调用上:

feedparser.parse("http://...")

这以前有效。该网址甚至无法在浏览器中打开。 你会如何治疗这个病例?有超时的可能吗?我想继续,就像什么都不会发生一样(仅打印一些消息或记录此问题)

python feedparser
4个回答
24
投票

使用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)

17
投票

您可以使用

socket.setdefaulttimeout()
全局指定超时。

超时可能会限制单个套接字操作可以持续的时间 -

feedparser.parse()
可能会执行许多套接字操作,因此花费在 dns、建立 tcp 连接、发送/接收数据上的总时间可能会更长。请参阅使用 urllib2 或任何其他 http 库读取超时


7
投票

根据作者的建议[1],你应该使用requests库来做http请求,并将结果解析到feedparser。

[1] https://github.com/kurtmckee/feedparser/pull/80


0
投票

如果你想要一个快速的解决方法,你可以猴子补丁并使用请求库,而不是适当的超时。它还修复了我在默认 feedparser url 打开实现中遇到的 https 证书问题。我就是这样做的:

feedparser._open_resource = lambda *args, **kwargs: feedparser._StringIO(requests.get(args[0], timeout=5).content)

更新:在 6.x 以上的版本上使用以下内容:

feedparser.api._open_resource = lambda *args, **kwargs: requests.get(args[0], headers=headers, timeout=5).content

darklow

保留所有权利
© www.soinside.com 2019 - 2024. All rights reserved.