Я пытаюсь сбросить данные из массива в файл csv, но выдает следующую ошибку: AttributeError: объект «NavigableString» не имеет атрибута «ключи» в python. В массиве есть данные, когда я пытаюсь его распечатать, но при попытке создать CSV-файл выдает ошибку.
Это код, который я написал:
import requests
import csv
from bs4 import BeautifulSoup as bs
global newsitems
def loadRSS():
url = "https://rss.nytimes.com/services/xml/rss/nyt/Africa.xml"
resp=requests.get(url)
with open('topnewsfeed.xml','wb') as f:
f.write(resp.content)
def extractData():
infile = open("topnewsfeed.xml","r",encoding='utf-8')
contents = infile.read()
soup = bs(contents,'xml')
guids= soup.find_all('guid')
titles = soup.find_all('title')
pubDates= soup.find_all('pubDate')
descs= soup.find_all('description')
links= soup.find_all('link')
newsitems=[]
for (guid,title,pubDate,desc,link) in zip(guids,titles,pubDates,descs,links):
newsitems.append(guid.string)
newsitems.append(title.string)
newsitems.append(pubDate.string)
newsitems.append(desc.string)
newsitems.append(link.string)
return newsitems
def savetoCSV(array,filename):
fields=['Guid','Title','PubDate','Description','Link']
with open(filename,'w') as csvfile:
writer=csv.DictWriter(csvfile,fieldnames=fields)
writer.writeheader()
writer.writerows(array)
def run():
loadRSS()
newsitems=extractData()
savetoCSV(newsitems,'topnews.csv')
run()
Итак, как я могу исправить это в своем коде? @sytech
writerows DictWriter ожидает последовательность dicts (с именами полей в качестве ключей, сопоставленных со значениями), а не последовательность объектов NavigableString, что и представляет собой newsitems.
Вместо создания последовательности навигационных строк:
for (guid,title,pubDate,desc,link) in zip(guids,titles,pubDates,descs,links):
newsitems.append(guid.string)
newsitems.append(title.string)
newsitems.append(pubDate.string)
newsitems.append(desc.string)
newsitems.append(link.string)
Составьте список словарей, как того ожидает writerows
. Ключи в словаре должны соответствовать вашему полю CSV ('Guid','Title','PubDate','Description','Link'
)
for (guid,title,pubDate,desc,link) in zip(guids,titles,pubDates,descs,links):
newsitems.append({
'Guid': guid.string,
'Title': title.string,
'PubDate': pubDate.string,
'Description': desc.string,
'Link': link.string
}
)
writerows
изDictWriter
ожидает последовательность диктов (с именами полей в качестве ключей, сопоставленных со значениями), а не последовательность объектов NavigableString, что и естьnewsitems
.