0


feedparser - Python 解析Atom和RSSfeed

文章目录


一、关于 feedparser

在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"?><rssversion="2.0"><channel><title>Sample Feed</title><description>For documentation &lt;em&gt;only&lt;/em&gt;</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 &lt;span style="background-image:
url(javascript:window.location='http://example.org/')"&gt;nasty
tricks&lt;/span&gt;</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"?><feedxmlns="http://www.w3.org/2005/Atom"xml:base="http://example.org/"xml:lang="en"><titletype="text">Sample Feed</title><subtitletype="html">
For documentation &lt;em&gt;only&lt;/em&gt;</subtitle><linkrel="alternate"href="/"/><linkrel="self"type="application/atom+xml"href="http://www.example.org/atom10.xml"/><rightstype="html">&lt;p>Copyright 2005, Mark Pilgrim&lt;/p>&lt;</rights><id>tag:feedparser.org,2005-11-09:/docs/examples/atom10.xml</id><generatoruri="http://example.org/generator/"version="4.0">
Sample Toolkit
</generator><updated>2005-11-09T11:56:34Z</updated><entry><title>First entry title</title><linkrel="alternate"href="/entry/3"/><linkrel="related"type="text/html"href="http://search.example.com/"/><linkrel="via"type="text/html"href="http://toby.example.com/examples/atom10"/><linkrel="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><summarytype="text/plain"mode="escaped">Watch out for nasty tricks</summary><contenttype="application/xhtml+xml"mode="xml"xml:base="http://example.org/entry/3"xml:lang="en-US"><divxmlns="http://www.w3.org/1999/xhtml">Watch out for
<spanstyle="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(五)

标签: python feedparser atom

本文转载自: https://blog.csdn.net/lovechris00/article/details/139521166
版权归原作者 ez_scope 所有, 如有侵权,请联系我们删除。

“feedparser - Python 解析Atom和RSSfeed”的评论:

还没有评论