文章目录
- 一、关于 feedparser
- 二、安装
- 三、关于文档及构建
- 四、测试
- 五、常见RSS元素
- 访问常见 Channel 元素
- 访问常用项目元素
- 六、常见Atom元素
- 访问常用feed元素
- 访问公共入口元素
- 七、获取Atom元素的详细信息
- Feed元素的详细信息
- 八、测试元素是否存在
- 九、其他功能 & 文档
- 高级功能
- HTTP特性
- 十、Reference
一、关于 feedparser
- github : https://github.com/kurtmckee/feedparser
- 文档:https://feedparser.readthedocs.io/en/latest/
在Python中解析Atom和RSSfeed。
二、安装
可以通过运行pip来安装:
pip install feedparser
三、关于文档及构建
feedparser 文档 :https://feedparser.readthedocs.io/en/latest/
它还包含在docs/
目录中的源格式 ReST中。
要构建文档,您需要Sphinx包,下载地址:https://www.sphinx-doc.org/
然后,您可以使用类似于以下命令,构建 HTML 页面:
sphinx-build -b html docs/ fpdocs
这将在fpdocs/
目录中,产生HTML文档。
四、测试
Feedparser 有一个广泛的测试套件,由Tox提供支持。要运行它,请键入以下内容:
$ python -m venv venv
$ source venv/bin/activate # or "venv\bin\activate.ps1" on Windows
(venv) $ python -m pip install --upgrade pip
(venv) $ python -m pip install tox
(venv) $ tox
五、常见RSS元素
RSS feeds 中最常用的元素(无论版本如何)是标题、链接、描述、发布日期和条目ID。发布日期来自 pubDate 元素,条目ID 来自guid元素。
此示例RSSfeed位于 https://feedparser.readthedocs.io/en/latest/examples/rss20.xml。
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Sample Feed</title>
<description>For documentation <em>only</em></description>
<link>http://example.org/</link>
<pubDate>Sat, 07 Sep 2002 00:00:01 GMT</pubDate>
<!-- other elements omitted from this example -->
<item>
<title>First entry title</title>
<link>http://example.org/entry/3</link>
<description>Watch out for <span style="background-image:
url(javascript:window.location='http://example.org/')">nasty
tricks</span></description>
<pubDate>Thu, 05 Sep 2002 00:00:01 GMT</pubDate>
<guid>http://example.org/entry/3</guid>
<!-- other elements omitted from this example -->
</item>
</channel>
</rss>
通道元素在d.feed
中可用。
访问常见 Channel 元素
>>> import feedparser
>>> d = feedparser.parse('https://feedparser.readthedocs.io/en/latest/examples/rss20.xml')
>>> d.feed.title
'Sample Feed'
>>> d.feed.link
'http://example.org/'
>>> d.feed.description
'For documentation <em>only</em>'
>>> d.feed.published
'Sat, 07 Sep 2002 00:00:01 GMT'
>>> d.feed.published_parsed
(2002, 9, 7, 0, 0, 1, 5, 250, 0)
d.entries
中的这些项目可用,这是一个列表。
您可以按照它们在原始feed中出现的顺序 访问列表中的项目,因此在d.entries[0]
中的第一个项目可用。
访问常用项目元素
>>> import feedparser
>>> d = feedparser.parse('https://feedparser.readthedocs.io/en/latest/examples/rss20.xml')
>>> d.entries[0].title
'First item title'
>>> d.entries[0].link
'http://example.org/item/1'
>>> d.entries[0].description
'Watch out for <span>nasty tricks</span>'
>>> d.entries[0].published
'Thu, 05 Sep 2002 00:00:01 GMT'
>>> d.entries[0].published_parsed
(2002, 9, 5, 0, 0, 1, 3, 248, 0)
>>> d.entries[0].id
'http://example.org/guid/1'
注:您还可以使用Atom术语 从RSSfeed访问数据。有关详细信息,请参阅 Content Normalization 。
六、常见Atom元素
Atomfeed通常比RSSfeed包含更多信息(因为需要更多元素),但最常用的元素仍然是标题、链接、副标题/描述、各种日期和ID。
此示例Atomfeed https://feedparser.readthedocs.io/en/latest/examples/atom10.xml 。
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
xml:base="http://example.org/"
xml:lang="en">
<title type="text">Sample Feed</title>
<subtitle type="html">
For documentation <em>only</em>
</subtitle>
<link rel="alternate" href="/"/>
<link rel="self"
type="application/atom+xml"
href="http://www.example.org/atom10.xml"/>
<rights type="html">
<p>Copyright 2005, Mark Pilgrim</p><
</rights>
<id>tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml</id>
<generator
uri="http://example.org/generator/"
version="4.0">
Sample Toolkit
</generator>
<updated>2005-11-09T11:56:34Z</updated>
<entry>
<title>First entry title</title>
<link rel="alternate"
href="/entry/3"/>
<link rel="related"
type="text/html"
href="http://search.example.com/"/>
<link rel="via"
type="text/html"
href="http://toby.example.com/examples/atom10"/>
<link rel="enclosure"
type="video/mpeg4"
href="http://www.example.com/movie.mp4"
length="42301"/>
<id>tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml:3</id>
<published>2005-11-09T00:23:47Z</published>
<updated>2005-11-09T11:56:34Z</updated>
<summary type="text/plain" mode="escaped">Watch out for nasty tricks</summary>
<content type="application/xhtml+xml" mode="xml"
xml:base="http://example.org/entry/3" xml:lang="en-US">
<div xmlns="http://www.w3.org/1999/xhtml">Watch out for
<span style="background: url(javascript:window.location='http://example.org/')">
nasty tricks</span></div>
</content>
</entry>
</feed>
feed 元素在d.feed
中可用。
访问常用feed元素
>>> import feedparser
>>> d = feedparser.parse('https://feedparser.readthedocs.io/en/latest/examples/atom10.xml')
>>> d.feed.title
'Sample feed'
>>> d.feed.link
'http://example.org/'
>>> d.feed.subtitle
'For documentation <em>only</em>'
>>> d.feed.updated
'2005-11-09T11:56:34Z'
>>> d.feed.updated_parsed
(2005, 11, 9, 11, 56, 34, 2, 313, 0)
>>> d.feed.id
'tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml'
条目在d.entries
中可用,这是一个列表。
您可以在 它们在原始feed中出现的顺序,因此第一个条目是 d.entries[0]
。
访问公共入口元素
>>> import feedparser
>>> d = feedparser.parse('https://feedparser.readthedocs.io/en/latest/examples/atom10.xml')
>>> d.entries[0].title
'First entry title'
>>> d.entries[0].link
'http://example.org/entry/3
>>> d.entries[0].id
'tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml:3'
>>> d.entries[0].published
'2005-11-09T00:23:47Z'
>>> d.entries[0].published_parsed
(2005, 11, 9, 0, 23, 47, 2, 313, 0)
>>> d.entries[0].updated
'2005-11-09T11:56:34Z'
>>> d.entries[0].updated_parsed
(2005, 11, 9, 11, 56, 34, 2, 313, 0)
>>> d.entries[0].summary
'Watch out for nasty tricks'
>>> d.entries[0].content
[{'type': 'application/xhtml+xml',
'base': 'http://example.org/entry/3',
'language': 'en-US',
'value': '<div>Watch out for <span>nasty tricks</span></div>'}]
注:解析后的摘要和内容 与它们出现在 原始feed 不用。原始元素包含危险的超文本标记语言标记,已被清理。详见 Sanitization 。
因为Atom条目可以有多个内容元素, d.entries[0].content
是字典的列表。
每个字典包含 关于单个内容元素的元信息。
字典中最重要的两个值是 内容类型(在d.entries[0].content[0].type
中)和 实际内容值(在d.entries[0].content[0].value
中)。
您也可以在其他Atom元素上获得此详细级别。
七、获取Atom元素的详细信息
几个Atom元素共享Atom内容模型:标题、副标题、权利、摘要,当然还有内容。(Atom 0.3也有一个共享此内容模型的info元素。)
通用Feed Parser 捕获关于这些元素的所有相关元信息,最重要的是体裁和值本身。
Feed元素的详细信息
>>> import feedparser
>>> d = feedparser.parse('https://feedparser.readthedocs.io/en/latest/examples/atom10.xml')
>>> d.feed.title_detail
{'type': 'text/plain',
'base': 'http://example.org/',
'language': 'en',
'value': 'Sample Feed'}
>>> d.feed.subtitle_detail
{'type': 'text/html',
'base': 'http://example.org/',
'language': 'en',
'value': 'For documentation <em>only</em>'}
>>> d.feed.rights_detail
{'type': 'text/html',
'base': 'http://example.org/',
'language': 'en',
'value': '<p>Copyright 2004, Mark Pilgrim</p>'}
>>> d.entries[0].title_detail
{'type': 'text/plain',
'base': 'http://example.org/',
'language': 'en',
'value': 'First entry title'}
>>> d.entries[0].summary_detail
{'type': 'text/plain',
'base': 'http://example.org/',
'language': 'en',
'value': 'Watch out for nasty tricks'}
>>> len(d.entries[0].content)
1
>>> d.entries[0].content[0]
{'type': 'application/xhtml+xml',
'base': 'http://example.org/entry/3',
'language': 'en-US'
'value': '<div>Watch out for <span> nasty tricks</span></div>'}
八、测试元素是否存在
现实世界中的Feeds可能缺少元素,甚至是规范要求的元素。
在获取元素值之前,您应该始终测试元素的存在。永远不要假设元素存在。
要测试元素是否存在,可以使用标准Python字典习语。
>>> import feedparser
>>> d = feedparser.parse('https://feedparser.readthedocs.io/en/latest/examples/atom10.xml')
>>> 'title' in d.feed
True
>>> 'ttl' in d.feed
False
>>> d.feed.get('title', 'No title')
'Sample feed'
>>> d.feed.get('ttl', 60)
60
九、其他功能 & 文档
高级功能
- 日期解析
- 日期格式的历史
- 识别日期格式
- 支持其他日期格式
- Sanitization
- HTML Sanitization
- SVG Sanitization
- MathML Sanitization
- CSS Sanitization
- 列入白名单,不要列入黑名单
- 内容标准化
- 将Atom feed 作为RSS feed 访问
- 将RSS feed 作为Atom feed 访问
- 命名空间处理
- 访问命名空间元素
- 使用非标准前缀 访问命名空间元素
- Relative Link Resolution
- 哪些值是URI
- 如何解决相对URI
- 禁用相对URI解析
- Feed Type and Version Detection feed类型和版本检测
- 访问feed版本
- 字符编码检测
- 字符编码简介
- 处理 Incorrectly-Declared 编码
- 处理 Incorrectly-Declared 媒体类型
- Bozo 检测
- 检测格式不正确的反馈
HTTP特性
- ETag 和最后修改的头文件
- 使用ETags减少带宽
- 使用Last-Modified 头文件来减少带宽
- User-Agent和Referer 头文件
- 自定义 User-Agent
- 永久自定义 User-Agent
- 自定义 referrer
- HTTP重定向
- 注意临时重定向
- 注意永久重定向
- 注意标记为“gone”的feeds
- 受密码保护的feed
- 下载 受基本鉴权保护 的 feed(简单方法)
- 下载 受摘要鉴权保护的feed(简单但非常不安全的方式)
- 下载受HTTP基本鉴权保护的feed(硬方法)
- 下载受HTTP摘要鉴权保护的feed(安全方式)
- 确定feed受密码保护
- 其他HTTP 头文件
- 发送自定义HTTP请求 头文件
- 访问其他HTTP响应 头文件
十、Reference
bozo
bozo_exception
encoding
entries
entries[i\].author
entries[i].author_detail
entries[i\].author_detail.name
entries[i\].author_detail.href
entries[i\].author_detail.email
entries[i\].comments
entries[i].content
entries[i\].content[j].value
entries[i\].content[j].type
entries[i\].content[j].language
entries[i\].content[j].base
entries[i].contributors
entries[i\].contributors[j].name
entries[i\].contributors[j].href
entries[i\].contributors[j].email
entries[i\].created
entries[i\].created_parsed
entries[i].enclosures
entries[i\].enclosures[j].href
entries[i\].enclosures[j].length
entries[i\].enclosures[j].type
entries[i\].expired
entries[i\].expired_parsed
entries[i\].id
entries[i\].license
entries[i\].link
entries[i].links
entries[i\].links[j].rel
entries[i\].links[j].type
entries[i\].links[j].href
entries[i\].links[j].title
entries[i\].published
entries[i\].published_parsed
entries[i\].publisher
entries[i].publisher_detail
entries[i\].publisher_detail.name
entries[i\].publisher_detail.href
entries[i\].publisher_detail.email
entries[i].source
entries[i\].source.author
entries[i\].source.author_detail
entries[i\].source.contributors
entries[i\].source.icon
entries[i\].source.id
entries[i\].source.link
entries[i\].source.links
entries[i\].source.logo
entries[i\].source.rights
entries[i\].source.rights_detail
entries[i\].source.subtitle
entries[i\].source.subtitle_detail
entries[i\].source.title
entries[i\].source.title_detail
entries[i\].source.updated
entries[i\].source.updated_parsed
entries[i\].summary
entries[i].summary_detail
entries[i\].summary_detail.value
entries[i\].summary_detail.type
entries[i\].summary_detail.language
entries[i\].summary_detail.base
entries[i].tags
entries[i\].tags[j].term
entries[i\].tags[j].scheme
entries[i\].tags[j].label
entries[i\].title
entries[i].title_detail
entries[i\].title_detail.value
entries[i\].title_detail.type
entries[i\].title_detail.language
entries[i\].title_detail.base
entries[i\].updated
entries[i\].updated_parsed
etag
feed
feed.author
feed.author_detail
feed.author_detail.name
feed.author_detail.href
feed.author_detail.email
feed.cloud
feed.cloud.domain
feed.cloud.port
feed.cloud.path
feed.cloud.registerProcedure
feed.cloud.protocol
feed.contributors
feed.contributors[i\].name
feed.contributors[i\].href
feed.contributors[i\].email
feed.docs
feed.errorreportsto
feed.generator
feed.generator_detail
feed.generator_detail.name
feed.generator_detail.href
feed.generator_detail.version
feed.icon
feed.id
feed.image
feed.image.title
feed.image.href
feed.image.link
feed.image.width
feed.image.height
feed.image.description
feed.info
feed.info_detail
feed.info_detail.value
feed.info_detail.type
feed.info_detail.language
feed.info_detail.base
feed.language
feed.license
feed.link
feed.links
feed.links[i\].rel
feed.links[i\].type
feed.links[i\].href
feed.links[i\].title
feed.logo
feed.published
feed.published_parsed
feed.publisher
feed.publisher_detail
feed.publisher_detail.name
feed.publisher_detail.href
feed.publisher_detail.email
feed.rights
feed.rights_detail
feed.rights_detail.value
feed.rights_detail.type
feed.rights_detail.language
feed.rights_detail.base
feed.subtitle
feed.subtitle_detail
feed.subtitle_detail.value
feed.subtitle_detail.type
feed.subtitle_detail.language
feed.subtitle_detail.base
feed.tags
feed.tags[i\].term
feed.tags[i\].scheme
feed.tags[i\].label
feed.textinput
feed.textinput.title
feed.textinput.link
feed.textinput.name
feed.textinput.description
feed.title
feed.title_detail
feed.title_detail.value
feed.title_detail.type
feed.title_detail.language
feed.title_detail.base
feed.ttl
feed.updated
feed.updated_parsed
headers
href
modified
namespaces
status
version
2024-06-07(五)