#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):
.