文章目录
一、关于 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 <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"?><feedxmlns="http://www.w3.org/2005/Atom"xml:base="http://example.org/"xml:lang="en"><titletype="text">Sample Feed</title><subtitletype="html">
For documentation <em>only</em></subtitle><linkrel="alternate"href="/"/><linkrel="self"type="application/atom+xml"href="http://www.example.org/atom10.xml"/><rightstype="html"><p>Copyright 2005, Mark Pilgrim</p><</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].baseentries[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.emailentries[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.baseentries[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.emailfeed.cloud- feed.cloud.domain- feed.cloud.port- feed.cloud.path- feed.cloud.registerProcedure- feed.cloud.protocolfeed.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.basefeed.tags- feed.tags[i].term- feed.tags[i].scheme- feed.tags[i].labelfeed.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(五)
版权归原作者 ez_scope 所有, 如有侵权,请联系我们删除。