当前位置: 首页>>技术教程>>正文


在Python中使用Feedparser解析RSS

总览

在本文中,我们将简要介绍如何使用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的简单而有趣的方法。


参考资料

本文由《纯净天空》出品。文章地址: https://vimsky.com/article/4399.html,未经允许,请勿转载。