總覽
在本文中,我們將簡要介紹如何使用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的簡單而有趣的方法。