python universal feed parser
universal feed parser的实现并不太多,feedparser 算是其中最健壮的一个,可以做一些数据修复以及处理各种格式的rss. 但是就是速度比较慢。cfeedparser 看上会比较快速,但是感觉不能应对各种rss(我没有尝试这个库,后面我会试试这个库,估计速度是慢不了的). 一个看上去比较折衷(不做数据修复)但是速度也比较快的实现是speedparser. 从代码上看这个库基于feedparser做了一些改动,牺牲了一些准确性但是提升了速度。在prod环境下面我是这样使用的
try:
dom = speedparser.parse(data)
except:
dom = feedparser.parse(data)
这种方式要求两种parser输出结果标签要一致。虽然speedparser fork下来的代码输出结果和feedparser输出有一些出入,但是可以通过修改speedparser代码来解决。比如添加itunes:author对应到author这个标签上,然后仿照parse_date添加一个parse_author实现
class SpeedParserFeedRss20(object):
channel_xpath = '/rss/channel'
tag_map = {
'title': 'title',
'itunes:title': 'title',
'description': 'summary',
'tagline': 'subtitle',
'subtitle': 'subtitle',
'link': 'links',
'pubDate': 'date',
'updated': 'date',
'modified': 'date',
'date': 'date',
'generator': 'generator',
'generatorAgent': 'generator',
'language': 'lang',
'id': 'id',
'lastBuildDate': 'date',
'itunes:summary': 'summary',
'itunes:image': 'image',
'author': 'author',
'itunes:author': 'author'
}
def parse_author(self, node, feed, ns = ''):
feed['author'] = strip_outer_tag(self.clean(unicoder(node.text))) or ''
速度上我也简单地对比了两者. 代码如下。 parse数据100遍,feedparser用时28.96, speedparser在15.24s. 接近一倍。
#!/usr/bin/env python
# coding:utf-8
# Copyright (C) dirlt
import feedparser
import speedparser
import requests
r = requests.get('http://nj.lizhi.fm/rss/353471.xml')
data = r.content
import time
"""
feedparser = 28.96
speedparser = 15.24
"""
s = time.time()
for i in xrange(100):
d = feedparser.parse(data)
e = time.time()
print 'feedparser = %.2f' % (e - s)
s = time.time()
for i in xrange(100):
d = speedparser.parse(data)
e = time.time()
print 'speedparser = %.2f' % (e - s)