Я пытаюсь очистить от первой страницы до страницы 14 этого сайта: https://cross-currents.berkeley.edu/archives?author=&title=&type=All&issue=All®ion=All Вот мой код:
import requests as r
from bs4 import BeautifulSoup as soup
import pandas
#make a list of all web pages' urls
webpages=[]
for i in range(15):
root_url = 'https://cross-currents.berkeley.edu/archives?author=&title=&type=All&issue=All®ion=All&page='+ str(i)
webpages.append(root_url)
print(webpages)
#start looping through all pages
for item in webpages:
headers = {'User-Agent': 'Mozilla/5.0'}
data = r.get(item, headers=headers)
page_soup = soup(data.text, 'html.parser')
#find targeted info and put them into a list to be exported to a csv file via pandas
title_list = [title.text for title in page_soup.find_all('div', {'class':'field field-name-node-title'})]
title = [el.replace('\n', '') for el in title_list]
#export to csv file via pandas
dataset = {'Title': title}
df = pandas.DataFrame(dataset)
df.index.name = 'ArticleID'
df.to_csv('example31.csv',encoding="utf-8")
Выходной файл csv содержит только адресную информацию последней страницы. Когда я печатаю "веб-страницы", это показывает, что все URL-адреса страниц были правильно помещены в список. Что я делаю неправильно? Заранее спасибо!
Вы просто перезаписываете один и тот же выходной файл CSV для всех страниц, вы можете вызвать .to_csv()
в режиме "добавить", чтобы добавить новые данные в конец существующего файла:
df.to_csv('example31.csv', mode='a', encoding="utf-8", header=False)
Или даже лучше было бы собирать заголовки в список названий, а затем сбрасывать в CSV один раз:
#start looping through all pages
titles = []
for item in webpages:
headers = {'User-Agent': 'Mozilla/5.0'}
data = r.get(item, headers=headers)
page_soup = soup(data.text, 'html.parser')
#find targeted info and put them into a list to be exported to a csv file via pandas
title_list = [title.text for title in page_soup.find_all('div', {'class':'field field-name-node-title'})]
titles += [el.replace('\n', '') for el in title_list]
# export to csv file via pandas
dataset = [{'Title': title} for title in titles]
df = pandas.DataFrame(dataset)
df.index.name = 'ArticleID'
df.to_csv('example31.csv', encoding="utf-8")
Другим способом, помимо того, что было опубликовано в Alexce, было бы добавить добавление фрейма данных в новый фреймворк данных, а затем записать его в CSV.
Объявлять finalDf как фрейм данных вне циклов:
finalDf = pandas.DataFrame()
Позже сделайте следующее:
for item in webpages:
headers = {'User-Agent': 'Mozilla/5.0'}
data = r.get(item, headers=headers)
page_soup = soup(data.text, 'html.parser')
#find targeted info and put them into lists to be exported to a csv file via pandas
title_list = [title.text for title in page_soup.find_all('div', {'class':'field field-name-node-title'})]
title = [el.replace('\n', '') for el in title_list]
#export to csv file via pandas
dataset = {'Title': title}
df = pandas.DataFrame(dataset)
finalDf = finalDf.append(df)
#df.index.name = 'ArticleID'
#df.to_csv('example31.csv', mode='a', encoding="utf-8", header=False)
finalDf = finalDf.reset_index(drop = True)
finalDf.index.name = 'ArticleID'
finalDf.to_csv('example31.csv', encoding="utf-8")
Обратите внимание на строки с finalDf