2

我正在尝试使用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_code或值中表现出来。namespaces

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

4

1 回答 1

5

根据feedparser文档,在Bozo 检测部分:

通用提要解析器可以解析提要,无论它们是否是格式良好的 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必须是有效的提要格式版本等),无论您的应用程序似乎最合理。

于 2010-12-25T19:56:06.500 回答