2017-01-12 10 views
2

Я пытаюсь вытащить очень специфические элементы из словаря данных RSS, который был извлечен с использованием библиотеки feedparser, затем поместите эти данные в новый словарь, чтобы он мог вызывать позже, используя Flask. Причина, по которой я это делаю, заключается в том, что исходный словарь содержит множество метаданных, которые мне не нужны.FOR цикл должен давать несколько результатов, но дает только один

Я разбил процесс на простые шаги, но продолжаю зависеть от создания нового словаря! Как это ниже, это делает, создавая объект словаря, но он не является исчерпывающим: он содержит только статьи, URL и описание - остальное отсутствует.

Я попытался переключиться на другие каналы RSS и получил тот же результат, поэтому проблема будет либо в том, как я пытаюсь это сделать, либо что-то не так со структурой списка, сгенерированного feedparser ,

Вот мой код:

from html.parser import HTMLParser 
import feedparser 

def get_feed(): 
    url = "http://thefreethoughtproject.com/feed/" 
    front_page = feedparser.parse(url) 
    return front_page 

feed = get_feed() 

# make a dictionary to update with the vital information 
posts = {} 

for i in range(0, len(feed['entries'])): 
    posts.update({ 
     'title': feed['entries'][i].title, 
     'description': feed['entries'][i].summary, 
     'url': feed['entries'][i].link, 
    }) 

print(posts) 

В конце концов, я хотел бы иметь словарь, как в следующем, за исключением того, что она продолжает идти с большим количеством статей:

[{'Title': 'Trump Does Another Ridiculous Thing', 
    'Description': 'Witnesses looked on in awe as the Donald did this thing', 
    'Link': 'SomeNewsWebsite.com/Story12345'}, 
{...}, 
{...}] 

Что-то подсказывает мне, что это простая ошибка - возможно, синтаксис выключен, или я забываю небольшую, но важную деталь.

ответ

3

Пример кода, который вы предоставили, повторяет код update. Таким образом, вы получаете только один dict в конце цикла. Что ваш пример показывает данные, в том, что вы на самом деле хотите list словарей:

# make a list to update with the vital information 
posts = [] 

for entry in feed['entries']: 
    posts.append({ 
     'title': entry.title, 
     'description': entry.summary, 
     'url': entry.link, 
    }) 

print(posts) 
2

Кажется, что проблема заключается в том, что вы используете Dict вместо списка. Затем вы обновляете одни и те же ключи dict, поэтому каждая итерация вы переопределяете добавленный последний контент.

Я думаю, что следующий код будет решить вашу проблему:

from html.parser import HTMLParser 
import feedparser 

def get_feed(): 
    url = "http://thefreethoughtproject.com/feed/" 
    front_page = feedparser.parse(url) 
    return front_page 

feed = get_feed() 

# make a dictionary to update with the vital information 
posts = [] # It should be a list 


for i in range(0, len(feed['entries'])): 
    posts.append({ 
     'title': feed['entries'][i].title, 
     'description': feed['entries'][i].summary, 
     'url': feed['entries'][i].link, 
    }) 

print(posts) 

Так как вы можете видеть код выше определение сообщения переменного в виде списка. Затем в цикле мы добавляем dicts в этот список, поэтому он даст вам структуру данных, которую вы хотите.

Я надеюсь помочь вам с этим решением.