【问题标题】:How to make Universal Feed Parser only parse feeds?如何使 Universal Feed Parser 仅解析提要?
【发布时间】:2010-12-25 15:49:58
【问题描述】:

我正在尝试使用Universal Feed Parser 从我的 Django 网站上的外部提要获取内容。我想要一些用户错误处理,例如如果用户提供的 URL 不是提要。当我尝试 feedparser 如何响应错误输入时,我惊讶地发现 feedparser 根本没有抛出任何异常。例如。在 HTML 内容上,它会尝试从 HTML 代码中解析一些信息,而在不存在的域上,它会返回一个大部分为空的字典:

{'bozo': 1,
'bozo_exception': URLError(gaierror(-2, 'Name or service not known'),),
'encoding': 'utf-8',
'entries': [],
'feed': {},
'version': None}

其他错误输入在返回的字典中的status_codenamespaces 值中表现出来。

那么,在不诉诸if .. elif .. elif ... 的无休止级联的情况下进行合理的错误检查的最佳方法是什么?

【问题讨论】:

    标签: python feedparser


    【解决方案1】:

    根据feedparser 文档,在Bozo Detection 部分:

    通用提要解析器可以解析提要,无论它们是否是格式良好的 XML。但是,由于某些应用程序可能希望拒绝或警告用户格式不正确的提要,通用提要解析器会在检测到提要格式不正确时设置 bozo 位。

    (在我看来,捕获所有异常并以另一种形式返回它们并不是一个很好的做法,但这就是它的工作方式,因为“应用程序可能只是警告格式不正确的提要”。)

    因此,在尝试解析任何 URL 的提要后,您可以检查“bozo bit”并重新引发相应的异常:

    f = feedparser.parse('http://example.com')
    if f.bozo:
        raise f.bozo_exception
    

    您可以根据类型和消息来处理异常,或者对feedparser.parse返回的对象的其他属性进行断言(如:f.feed必须非空,f.status必须等于200, f.entries 必须是非空的,f.version 必须是有效的提要格式版本,等等),无论您的应用程序是否认为最合理。

    【讨论】:

    • 谢谢! version 属性或多或少提供了我需要决定是否接受资源作为提要的信息。
    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2015-11-20
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多