【问题标题】:Get Feeds from FeedParser and Import to Pandas DataFrame从 FeedParser 获取提要并导入到 Pandas DataFrame
【发布时间】:2017-08-15 20:29:37
【问题描述】:

我正在学习 python。作为实践,我正在使用 feedparser 构建一个 rss 刮板,将输出放入 pandas 数据框并尝试使用 NLTK 进行挖掘……但我首先从多个 RSS 提要中获取文章列表。

我使用了这篇关于如何pass multiple feeds 的帖子,并将它与我之前得到的另一个关于如何将其放入Pandas dataframe 的问题的答案结合起来。

问题是什么,我希望能够从我的数据框中的所有提要中查看数据。目前我只能访问提要列表中的第一项。

FeedParser 似乎在做它的工作,但是当将它放入 Pandas df 时,它似乎只抓取列表中的第一个 RSS。

import feedparser
import pandas as pd

rawrss = [
    'http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml',
    'https://www.yahoo.com/news/rss/',
    'http://www.huffingtonpost.co.uk/feeds/index.xml',
    'http://feeds.feedburner.com/TechCrunch/',
    ]

feeds = []
for url in rawrss:
    feeds.append(feedparser.parse(url))

for feed in feeds:
    for post in feed.entries:
        print(post.title, post.link, post.summary)

df = pd.DataFrame(columns=['title', 'link', 'summary'])

for i, post in enumerate(feed.entries):
    df.loc[i] =  post.title, post.link, post.summary

df.shape

df

【问题讨论】:

  • 问题是您只能看到 DataFrame 中最后一个提要的数据,对吗?您想要 DataFrame 中每个提要的数据吗?
  • 是的。抱歉,我将对此进行编辑和澄清。

标签: python pandas feedparser


【解决方案1】:

您的代码将遍历每个帖子并打印其数据。将发布数据添加到数据框中的代码部分不是循环的一部分(在 python 中缩进是有意义的!),因此您只能在数据框中看到来自一个提要的数据。

您可以在循环浏览提要时构建一个帖子列表,然后在最后创建一个数据框:

import feedparser
import pandas as pd

rawrss = [
    'http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml',
    'https://www.yahoo.com/news/rss/',
    'http://www.huffingtonpost.co.uk/feeds/index.xml',
    'http://feeds.feedburner.com/TechCrunch/',
    ]

feeds = [] # list of feed objects
for url in rawrss:
    feeds.append(feedparser.parse(url))

posts = [] # list of posts [(title1, link1, summary1), (title2, link2, summary2) ... ]
for feed in feeds:
    for post in feed.entries:
        posts.append((post.title, post.link, post.summary))

df = pd.DataFrame(posts, columns=['title', 'link', 'summary']) # pass data to init

您可以通过组合两个 for 循环来稍微优化一下:

posts = []
for url in rawrss:
    feed = feedparser.parse(url)
    for post in feed.entries:
        posts.append((post.title, post.link, post.summary))

【讨论】:

  • 谢谢,效果很好。还正确地向我展示了缩进及其效果。也感谢优化版本,我看到并理解你在那里做了什么,我正在使用它。
  • @beenjaminnn 在代码的第二部分中,检查列表中是否已存在 URL 并且仅在 URL 唯一时才附加的最佳方法是什么?
  • 我假设您的意思是仅在posts 列表中不存在链接的情况下附加帖子?我会将标题、链接和摘要列表分开,然后检查if post.link in links
【解决方案2】:

我正在使用dict 构建DataFrame:

import feedparser
import pandas as pd

rawrss = [
    'http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml',
    'https://www.yahoo.com/news/rss/',
    'http://www.huffingtonpost.co.uk/feeds/index.xml',
    'http://feeds.feedburner.com/TechCrunch/',
    ]

df = pd.DataFrame([])

for url in rawrss:
    dp = feedparser.parse(url)

    for i, e in enumerate(dp.entries):
        one_feed = {}
        one_feed['etitle'] = e.title if 'title' in e else f'title {i}'
        one_feed['summary'] = e.summary if 'summary' in e else f'no summary {i}'
        one_feed['elink'] = e.link if 'link' in e else f'link {i}'
        one_feed['published'] = e.published if 'published' in e else f'no published {i}'
        one_feed['elink_img'] = e.links[1].href if 'links' in e and len(e.links)>1 else f'no link_img {i}'

        df = df.append(pd.DataFrame([one_feed]), ignore_index=True)

以这种方式添加列更容易。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2018-04-23
    • 2021-06-03
    • 2018-11-19
    • 2015-07-29
    • 2017-09-16
    • 2018-01-22
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多