Как мне добавить таблицы из нескольких страниц в один CSV с помощью BeautifulSoup? - PullRequest
2 голосов
/ 28 апреля 2019

Что не работает

В CSV сохраняется только последняя * выбранная страница , а не все выбранные страницы.

Что работает

  1. Желаемый контент для одной страницы просто отлично попадает в CSV.
  2. Загрузка «следующей» страницы определенное количество раз.

Попытка / недоразумение

Я думал, что мог бы поместить код под for page in range(0, pages): в цикл.Но это генерирует IndentationError.Я предполагаю, что мне нужно добавить каждую страницу, но я слишком нов, чтобы понять, как все соединить.Спасибо, что указали мне правильное направление.

Код, который выдает CSV последней загруженной страницы

import requests
from bs4 import BeautifulSoup
import csv

start = "http://awebsite.com/index.php?filter=&cur_page=0"
url = "http:/awebsite.comindex.php?filter=&cur_page={}"
soup = BeautifulSoup(requests.get(start).content)
pages = 2


for page in range(0, pages):
    soup = BeautifulSoup(requests.get(url.format(page)).content)

table = soup2.find("table", class_ ="style10b")
output_rows = []
for table_row in table.findAll('tr'):
    columns = table_row.findAll('td')
    output_row = []
    for column in columns:
        output_row.append(column.encode_contents())
    output_rows.append(output_row)

with open('output.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(output_rows)

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Вы можете использовать панд и конкат

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "http://www.bhpa.co.uk/documents/safety/informal_investigations/index.php?filter=&cur_page={}"
pages = 2
final = pd.DataFrame()

for page in range(0, pages):
    soup = BeautifulSoup(requests.get(url.format(page)).content, 'lxml')
    table = pd.read_html(str(soup.select_one('table.style10b')),header =0, flavor = 'bs4')[0][:-2]
    final = pd.concat([final, table], axis=0,  ignore_index=True).fillna('')

print(final)
final.to_csv(r"C:\Users\User\Desktop\test.csv", encoding='utf-8-sig', index = False)
0 голосов
/ 28 апреля 2019
import requests
from bs4 import BeautifulSoup
import csv

start = "http://www.bhpa.co.uk/documents/safety/informal_investigations/index.php?filter=&cur_page=0"
url = "http://www.bhpa.co.uk/documents/safety/informal_investigations/index.php?filter=&cur_page={}"
soup = BeautifulSoup(requests.get(start).content)
pages = 2
output_rows = []

for page in range(0, pages):
    soup = BeautifulSoup(requests.get(url.format(page)).content)

    table = soup.find("table", class_ ="style10b")
    for table_row in table.findAll('tr'):
        columns = table_row.findAll('td')
        output_row = []
        for column in columns:
            output_row.append(column.encode_contents())
        output_rows.append(output_row)

with open('output.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(output_rows)

Я отступил в коллекции страниц, которые должны быть внутри цикла страниц, удалил опечатку и получил output_rows сверху.Это должно сделать.В случае ошибки отступа будьте внимательны, чтобы не перепутать пробелы и отступы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...