Сохранение отдельных резюме для каждого элемента списка запросов

#python #python-3.x #csv #beautifulsoup

Вопрос:

Я новичок в Python и работаю над сценарием очистки веб-страниц, в котором есть список сайтов, и каждый раз, когда скрипт запрашивает сайт из списка, мне нужно сохранить его в отдельном файле CSV.

В настоящее время, похоже, он повторяет каждый сайт в моем списке, но сохраняет в CSV только элементы из самого последнего запроса ( www.website.com/3 ). Я понимаю, что как только он проходит по моему records списку, он сбрасывается, но разве он не должен сначала сохранить CSV? Если только файл просто не перезаписывается новыми данными, но если это так, как мне увеличить имена файлов для каждого запроса?

 from typing import Counter
import requests
from bs4 import BeautifulSoup
import sys
import csv

pages = [
    'https://www.website.com/1',
    'https://www.website.com/2',
    'https://www.website.com/3'
]

for page in pages:
    r = requests.get(page)
    soup = BeautifulSoup(r.content, 'lxml')
    productName = soup.find_all('div',class_='name')
    productID = soup.find_all('span', id='product_id')
    productCost = soup.find_all('span', class_='regular-price')

    records=[]
    for item in range(len(productName)):
        records.append({
            'name': productName[item].find('a').text.strip(),
            'product_ID': productID[item].text.strip(),
            'price': float(productCost[item].text.strip()[1:].replace(",",""))
            })

    with open("filename.csv", 'w', newline='') as outfile:
        writer = csv.DictWriter(outfile, fieldnames=records[0].keys())

        writer.writeheader()
        for record in records:
            writer.writerow(record)
 

Комментарии:

1. Конечно, он сохраняет CSV-файл, и в следующий раз в цикле вы открываете его снова, что стирает предыдущее содержимое. Вы ожидали, что он добавит данные? Вы, безусловно, можете сделать это, используя 'a' вместо 'w' . Или вы можете оставить счетчик и сделать open(f"filename{counter}.csv",'w') .

2. @Тим Робертс: Это не так просто, как открыть файл в 'a' режиме добавления при использовании csv.DictWriter , потому что он автоматически добавит ненужную строку заголовка в середине файла.

3. Абсолютно верно. Я надеялся привести ОП к пониманию поведения, которое он видит, сравнивая с 'a' ним .

4. ch11nV11n: Как вы хотите назвать эти отдельные CSV-файлы?

5. @martineau Я в идеале хотел бы сохранить каждый файл, добавив значение в конце. Или даже добавление содержимого каждого запроса в следующую доступную строку в одном файле будет работать.

Ответ №1:

Да, вы правы, содержимое файла перезаписывается здесь. Существует много способов обойти это ограничение, самым простым было бы, возможно, добавить целое значение к имени файла, чтобы его было легко интерпретировать.

 file_name = f'filename-{value}.csv'
with open(file_name, 'w', newline='') as outfile:
   ... your write logic goes here ...
   ... 
value = value   1
 

Вы можете инициализировать value переменную вверху 0 ( value = 0 ).
То, что я использовал при создании переменной file_name, называется f-strings в python, они помогают вам помещать динамическое содержимое в строку.

Комментарии:

1. Простой способ получить числовое value значение для использования-изменить внешний for цикл на: for value, page in enumerate(pages, start=1): .