我正在尝试使用Universal Feed Parser在我的Django网站上获取外部Feed的内容。我想要一些用户错误处理,例如如果用户提供的网址不是Feed。当我尝试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 ...
无休止的级联,那么最好的方法是进行正确的错误检查?
答案 0 :(得分:6)
根据feedparser
文档,在Bozo Detection部分:
Universal Feed Parser可以解析Feed,无论它们是否是格式良好的XML。但是,由于某些应用程序可能希望拒绝或警告用户有关非格式化的进给,因此Universal Feed Parser会在检测到进给不良的情况下设置bozo位。
(在我看来,捕获所有异常并以另一种形式返回它们并不是一个很好的做法,但这只是它的工作方式,因为“应用程序可能只是警告不良格式的提要”。)
因此,在尝试解析任何URL的Feed后,您可以检查“bozo位”并重新引发相应的异常:
f = feedparser.parse('http://example.com')
if f.bozo:
raise f.bozo_exception
您可以根据类型和消息处理异常,或者对feedparser.parse
返回的对象的其他属性进行断言(例如:f.feed
必须为非空,{{1 }}必须等于200,f.status
必须为非空,f.entries
必须是有效的Feed格式等,等等,无论您的应用程序看起来最合理。