如何让Universal Feed Parser仅解析订阅源?

2 投票
1 回答
2257 浏览
提问于 2025-04-16 09:01

我正在尝试在我的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_codenamespaces值中表现出来。

那么,怎样才能在不使用无休止的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 必须是一个有效的源格式版本,等等),选择对你的应用来说最合理的方式。

撰写回答