【问题标题】:feedparser with timeoutfeedparser 超时
【发布时间】:2012-04-04 02:05:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: python feedparser


    【解决方案1】:

    您可以使用socket.setdefaulttimeout() 全局指定超时。

    超时可能会限制单个套接字操作的持续时间——feedparser.parse() 可能会执行许多套接字操作,因此花费在 dns、建立 tcp 连接、发送/接收数据的总时间可能会更长。见Read timeout using either urllib2 or any other http library

    【讨论】:

    • 好的,我用过,不知道能不能用,因为无限加载的网址又激活了。
    【解决方案2】:

    使用 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 值长得多)。点击链接了解详情。
    • 我喜欢这个解决方案。我的 http 设置非常适合我的目的,但想为我在 rss 提要中找到的变体提供 feedparser。这让我可以两者兼得。谢谢!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多