2017-08-15 5 views
0

J'apprends Python. Comme pratique je construis un grattoir rss avec feedparser mettant la sortie dans un cadre de données pandas et essayant de mine avec NLTK ... mais je reçois d'abord une liste d'articles de plusieurs flux RSS.Obtenir des flux à partir FeedParser et importer à Pandas DataFrame

J'ai utilisé cet article sur la façon de pass multiple feeds et l'ai combiné avec une réponse que j'avais précédemment à une autre question sur comment l'obtenir dans un Pandas dataframe.

Quel est le problème, je veux être en mesure de voir les données de tous les flux de ma base de données. Actuellement, je ne peux accéder qu'au premier élément de la liste des flux.

FeedParser semble faire son travail, mais en le mettant dans la df de Pandas il semble seulement attraper le premier RSS dans la liste.

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 
+1

Le problème est que vous ne voyez que les données du dernier flux dans le DataFrame, est-ce correct? Vous voulez les données de chaque flux dans le DataFrame? – beenjaminnn

+0

Oui. Désolé, je vais éditer et clarifier ceci. –

Répondre

1

Votre code passera en revue chaque article et imprime ses données. La partie de votre code qui ajoute les données de publication à la trame de données ne fait pas partie de la boucle (dans l'indentation python est significatif!), Donc vous ne voyez que les données d'un flux dans votre dataframe.

Vous pouvez construire une liste des postes que vous boucle à travers les aliments, puis créer une trame de données à la fin:

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 

Vous pouvez optimiser ce un peu en combinant les deux pour les boucles:

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

Merci, cela fonctionne parfaitement. Aussi bien m'a montré l'indentation et ses effets. Merci aussi pour la version optimisée, je vois et comprends ce que vous avez fait là-bas et je l'utilise à la place. –