2017-02-01 4 views
1

Я хочу, чтобы Python3.6 записывал вывод следующего кода в csv. Было бы очень приятно иметь это так: одна строка для каждой статьи (это News-Website) и четыре столбца с «заголовком», «URL», «категория» [#Politik и т. Д.], «PublishedAt».Запись новостей в CSV-файл (Python 3, BeautifulSoup)

from bs4 import BeautifulSoup 
import requests 

website = 'http://spiegel.de/schlagzeilen' 
r = requests.get(website) 
soup = BeautifulSoup((r.content), "lxml") 

div = soup.find("div", {"class": "schlagzeilen-content schlagzeilen-overview"}) 

for a in div.find_all('a', title=True): 
    print(a.text, a.find_next_sibling('span').text) 
    print(a.get('href')) 

Для записи в формате CSV у меня уже есть это ...

with open('%s_schlagzeilen.csv' % datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S.%f'), 'w', newline='', 
       encoding='utf-8') as file: 
     w = csv.writer(file, delimiter="|") 
     w.writerow([...]) 

..и должны знать, что делать дальше. СПАСИБО!! заранее!

ответ

1

Вы можете собрать все нужные экстрагированных поля в список словарей и использовать csv.DictWriter для записи в файл CSV:

import csv 
import datetime 

from bs4 import BeautifulSoup 
import requests 


website = 'http://spiegel.de/schlagzeilen' 
r = requests.get(website) 
soup = BeautifulSoup((r.content), "lxml") 

articles = [] 
for a in soup.select(".schlagzeilen-content.schlagzeilen-overview a[title]"): 
    category, published_at = a.find_next_sibling(class_="headline-date").get_text().split(",") 

    articles.append({ 
     "Title": a.get_text(), 
     "URL": a.get('href'), 
     "Category": category.strip("()"), 
     "PublishedAt": published_at.strip("()") 
    }) 

filename = '%s_schlagzeilen.csv' % datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S.%f') 
with open(filename, 'w', encoding='utf-8') as f: 
    writer = csv.DictWriter(f, fieldnames=["Title", "URL", "Category", "PublishedAt"],) 

    writer.writeheader() 
    writer.writerows(articles) 

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