Соскреб BeautifulSoup4 не может выходить за пределы первой страницы веб-сайта (Python 3.6)

1

Я пытаюсь очистить от первой страницы до страницы 14 этого сайта: https://cross-currents.berkeley.edu/archives?author=&title=&type=All&issue=All&region=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&region=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-адреса страниц были правильно помещены в список. Что я делаю неправильно? Заранее спасибо!

Теги:
pandas
web-scraping
beautifulsoup

2 ответа

2
Лучший ответ

Вы просто перезаписываете один и тот же выходной файл 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")
  • 0
    большое спасибо!! Ваше первое предложение не сработало (все тот же результат), но «собрать заголовки в список заголовков и затем сбросить их в CSV один раз» сработало прекрасно!
1

Другим способом, помимо того, что было опубликовано в 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

  • 0
    спасибо за вклад! Это сработало, за исключением того, что номер индекса продолжал возвращаться к 0 после 19 (вместо 0-400, это 0-19, затем 0-19 снова и снова). Есть идеи, почему это так?
  • 0
    @AshleyLiu Я обновил ответ, добавив reset_index (), теперь у вас будет 0-400 :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню