Получить каналы из FeedParser и импортировать в Pandas DataFrame

Я изучаю питон. На практике я создаю скребок rss с помощью feedparser, помещая выходные данные в кадр данных pandas и пытаясь использовать NLTK ... но сначала я получаю список статей из нескольких RSS-каналов.

Я использовал этот пост о том, как передавать несколько фидов и объединил его с ответом, который я получил ранее, на другой вопрос о том, как поместить его в Фрейм данных Pandas.

В чем проблема, я хочу видеть данные из всех каналов в моем фрейме данных. В настоящее время я могу получить доступ только к первому элементу в списке каналов.

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

person Nick Duddy    schedule 15.08.2017    source источник
comment
Проблема в том, что вы видите данные только из последнего фида в DataFrame, верно? Вам нужны данные из каждого фида в DataFrame?   -  person beenjaminnn    schedule 15.08.2017
comment
да. Извините, я отредактирую и уточню это.   -  person Nick Duddy    schedule 16.08.2017


Ответы (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))
person beenjaminnn    schedule 16.08.2017
comment
Спасибо, это работает отлично. Также правильно показал мне об отступах и их последствиях. Также спасибо за оптимизированную версию, я вижу и понимаю, что вы там сделали, и я использую это вместо этого. - person Nick Duddy; 17.08.2017
comment
@beenjaminnn Каким будет наиболее оптимальный способ во второй части вашего кода проверить, что URL-адрес уже существует в вашем списке, и добавить только в том случае, если URL-адрес уникален? - person Pythoner; 14.10.2019
comment
Я предполагаю, что вы имеете в виду добавить сообщение только в том случае, если ссылка не существует в списке posts? Я бы сохранил список заголовков, ссылок и резюме отдельно, а затем проверил бы if post.link in links . - person beenjaminnn; 14.10.2019