总览
在本文中,我们将简要介绍如何使用Python下载和解析联合供稿(Rss Feed)。
在Python中跟这个功能相关模块是”Feedparser”。完整的英文文档可以在这里找到。
什么是RSS?
RSS是Rich Site Summary的缩写,它使用标准的Web Feed格式发布经常更新的信息:博客条目,新闻标题,音频,视频。
RSS文档(也称为”feed”,”web feed”或”channel”)包含完整或摘要的文本以及元数据,例如发布日期和作者姓名。RSS的详细定义见wikipedia: [资源]
什么是Feedparser?
Feedparser是一个Python库,用于解析所有已知格式的Feed,包括Atom,RSS和RDF。这个模块从Python 2.4到3.3一直都有支持。 [资源]
RSS元素
在安装feedparser模块并开始编码之前,让我们看一些可用的RSS元素。 RSS Feed中最常用的元素是:
“title”(标题),”link”(链接),”description”(描述),”publication date”(发布日期)和”entry ID”(资源ID)。
不太常用的元素是”image”(图像),”categories”(类别),”enclosures”(附件)和”cloud”。
安装Feedparser
要在计算机上安装feedparser,请打开您的终端,然后使用“pip”(用于安装和管理Python软件包的工具)
sudo pip install feedparser
要验证是否安装了feedparser,可以运行”pip list”。当然,您也可以进入交互模式,然后在其中导入feedparser模块。
如果看到如下所示的输出(也就是没有提示:模块找不到的报错),则可以确定已成功安装。
>>> import feedparser
>>>
现在我们已经安装了feedparser模块,接下来看看怎么使用。
获取RSS feed
您可以使用所需的任何RSS feed来源。由于我喜欢阅读Reddit,我将使用它作为示例。 Reddit由许多sub-reddits组成,我现在特别感兴趣的是”Python” sub-reddit。
获取RSS Feed的方法只是查找该sub-reddit的URL,并向其中添加”.rss”。我们需要的python sub-reddit的RSS feed是:http://www.reddit.com/r/python/.rss
使用Feedparser
您可以通过导入feedparser模块来启动程序。
import feedparser
创建Feed,放入所需的RSS feed。
d = feedparser.parse('http://www.reddit.com/r/python/.rss')
元素”channel”在d.feed中可用(回顾上面的”RSS Elements”(RSS元素))。这些项目(例如文章)在列表d.entries中可用。
您可以按在原始Feed中显示的顺序访问列表中的项目,因此d.entries [0]中提供了第一项。
打印提要的标题
print d['feed']['title']
>>> Python
解析相对链接
print d['feed']['link']
>>> http://www.reddit.com/r/Python/
解析转义的HTML
print d.feed.subtitle
>>> news about the dynamic, interpreted, interactive, object-oriented, extensible
programming language Python
查看条目数
print len(d['entries'])
>>> 25
Feed中的每个条目都是一个字典。用[0]打印第一个条目。
print d['entries'][0]['title']
>>> Functional Python made easy with a new library: Funcy
打印第一个条目的链接
print d.entries[0]['link']
>>> http://www.reddit.com/r/Python/comments/1oej74/functional_python_made_easy_with_a_new_
library/
使用for循环可打印所有帖子及其链接。
for post in d.entries:
print post.title + ": " + post.link + "
"
>>>
Functional Python made easy with a new library: Funcy: http://www.reddit.com/r/Python/
comments/1oej74/functional_python_made_easy_with_a_new_
library/
Python Packages Open Sourced: http://www.reddit.com/r/Python/comments/1od7nn/
python_packages_open_sourced/
PyEDA 0.15.0 Released: http://www.reddit.com/r/Python/comments/1oet5m/
pyeda_0150_released/
PyMongo 2.6.3 Released: http://www.reddit.com/r/Python/comments/1ocryg/
pymongo_263_released/
.....
.......
........
输出Feed类型和版本
print d.version
>>> rss20
完整访问所有HTTP标头
print d.headers
>>>
{'content-length': '5393', 'content-encoding': 'gzip', 'vary': 'accept-encoding', 'server':
"'; DROP TABLE servertypes; --", 'connection': 'close', 'date': 'Mon, 14 Oct 2013 09:13:34
GMT', 'content-type': 'text/xml; charset=UTF-8'}
只需从标题中获取content-type
print d.headers.get('content-type')
>>> text/xml; charset=UTF-8
使用feedparser是解析RSS feed的简单而有趣的方法。