如何让Universal Feed Parser仅解析订阅源?
我正在尝试在我的Django网站上使用Universal Feed Parser从外部源获取内容。我想为用户提供一些错误处理,比如如果用户提供的URL不是一个有效的源时该怎么办。当我测试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 ...
的情况下,进行合理的错误检查呢?
1 个回答
6
根据 feedparser
的文档,在 Bozo 检测 这一部分:
通用的 Feed 解析器可以解析无论是否格式正确的源(feed)。不过,有些应用可能希望拒绝或警告用户关于格式不正确的源,因此当通用 Feed 解析器发现源格式不正确时,会设置一个叫做“bozo bit”的标记。
(在我看来,捕捉所有异常并以另一种形式返回并不是一个很好的做法,但这就是它的工作方式,因为“应用可能只是会警告关于格式不正确的源”。)
所以,在尝试解析任何 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
必须是一个有效的源格式版本,等等),选择对你的应用来说最合理的方式。