其他分享
首页 > 其他分享> > 如何使Universal Feed Parser只解析feed?

如何使Universal Feed Parser只解析feed?

作者:互联网

我正在尝试使用Universal Feed Parser从我的Django网站上获取外部源的内容.我希望有一些用户错误处理,例如如果用户提供的网址不是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或返回字典中的命名空间值中表现出来.

那么,如果没有诉诸于无穷无尽的级联if,那么最好的方法是进行理智的错误检查.. elif … elif ……?

解决方法:

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

Universal Feed Parser can parse feeds whether they are well-formed XML or not. However, since some applications may wish to reject or warn users about non-well-formed feeds, Universal Feed Parser sets the bozo bit when it detects that a feed is not well-formed.

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

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

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

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

标签:python,feedparser
来源: https://codeday.me/bug/20190827/1738028.html