使用feedparser分别确定itunes:关键字和itunes:类别?

时间:2018-08-22 08:02:37

标签: python rss feedparser

我正在使用feedparser来解析诸如https://www.relay.fm/analogue/feed之类的rss提要,并且无法弄清楚如何明确标识itunes:category的值。

看着feedparser itunes tests,看来itunes:keywordsitunes:category的值都放在了feed['tags']字典中。

来自category的测试:

<!--
Description: iTunes channel category
Expect:      not bozo and feed['tags'][0]['term'] == 'Technology'
-->
<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd">
    <channel>
        <itunes:category text="Technology"></itunes:category>
    </channel>
</rss>

然后是keywords

<!--
Description: iTunes channel keywords
Expect:      not bozo and feed['tags'][0]['term'] == 'Technology' and 
'itunes_keywords' not in feed
-->
<rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd">
    <channel>
        <itunes:keywords>Technology</itunes:keywords>
    </channel>
</rss>

对于上面的示例供稿,条目为:

<itunes:keywords>Hurley, Liss, feelings</itunes:keywords>

<itunes:category text="Society &amp; Culture"/>
<itunes:category text="Technology"/>

feed[tags]填充为:

[{'label': None, 'scheme': 'http://www.itunes.com/', 'term': 'Hurley'},
 {'label': None, 'scheme': 'http://www.itunes.com/', 'term': 'Liss'},
 {'label': None, 'scheme': 'http://www.itunes.com/', 'term': 'feelings'},
 {'label': None,'scheme': 'http://www.itunes.com/','term': 'Society & Culture'},
 {'label': None, 'scheme': 'http://www.itunes.com/', 'term': 'Technology'}]

有什么方法可以唯一地标识来自itunes:category标记的值?

2 个答案:

答案 0 :(得分:0)

仅凭feedparser我找不到一种方法,所以我也使用了beautifulsoup

import bs4

soup = bs4.BeautifulSoup(raw_data, "lxml")        

def is_itunes_category(tag):
        return tag.name == 'itunes:category'

categories = [tag.attrs['text'] for tag in soup.find_all(is_itunes_category)]

答案 1 :(得分:0)

Feedparser v.6.0.2 实现特定的 itunes:x 属性

  • itunes:category 在 feedparser 中可用作 category
import feedparser
feedp = feedparser.parse(url)
category = feedp.feed.category 
  • itunes:keywords 确实在 feedparser 中重命名为 tags 并填充到 term

但渠道关键字与项目关键字混合 要单独识别项目关键字,请使用 scheme 作为过滤器

import feedparser
feedp = feedparser.parse(url)
#get all the keywords both item and channel
keywords = [k["term"] for k in feedp["feed"]["tags"]] 
# get the keywords from all the items 
keyword = [t["term"] for t in feedp["feed"]["tags"] if  t["scheme"] == 'http://www.itunes.com/']

这可能会删除其他标签(如果可用),但如果 itunes:keywords 和标签共存,则它们是重复的。

  • itunes:duration 可用作 itunes_duration
import feedparser
feedp = feedparser.parse(url)
duration = feedp["itunes_duration"] 

有点跑题,但要完成答案:

如果有多个类别可用,它们在类别中公开为元组 如documentation

中所述
>>>import feedparser
>>>feedp = feedparser.parse(url)
>>>categories = feedp.feed.categories 
>>>print(categories)
>>>[(u'Syndic8', u'1024'),
(u'dmoz', 'Top/Society/People/Personal_Homepages/P/')]

但 iTunes 没有多个类别...

不再需要用 beautifulSoup4 再次解析。