#python-3.x #selenium #csv #web-scraping #beautifulsoup
#python-3.x #selenium #csv #очистка веб-страниц #beautifulsoup
Вопрос:
Мне нужна помощь, чтобы выяснить, как вывести конечный результат этого python в csv (C:/temp/test.csv ) файл. Напишите, теперь он печатает его в приглашении. Я пытался использовать write, но я продолжал получать ошибки независимо от того, что я пытался. Моя главная цель — вывести информацию в csv без включения html и иметь запятые, разделяющие каждый результат (result2, result3, result4, result5). Но прямо сейчас я был бы просто рад возможности вывести его таким, какой он есть, в файл csv. Затем я могу работать над остальным.
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import csv
driver = webdriver.Chrome('C:/temp/chromedriver_win32/chromedriver.exe')
driver.get('https://www.dell.com/support/home/en-us/product-support/product/precision-15-5520-laptop/drivers')
time.sleep(3)
element = driver.find_element_by_xpath("//button[contains(.,'Show all')]").click();
page = driver.page_source
driver.close()
soup = BeautifulSoup(page,'html.parser')
results = soup.find(id='downloads-table')
results2 = results.find_all(class_='dl-desk-view')
results3 = results.find_all(class_='details-control sorting_1')
results4 = results.find_all(class_='details-control')
results5 = results.find_all(class_='btn-download-lg btn btn-sm no-break text-decoration-none dellmetrics-driverdownloads btn-outline-primary')
open('C:/temp/Precision_5520.csv', "w").close
with open('C:/temp/Precision_5520.csv', "a") as csvfile:
writer = csv.writer(csvfile)
for r2, r3, r4, r5 in zip(results2, results3, results4, results5):
writer.writerow([results2, results3, results4, results5])
Комментарии:
1. Какие ошибки вы получаете? Также вы пробовали использовать
Pandas
?2. Я добавил выше то, что я сейчас пытаюсь, это не работает, потому что слишком много аргументов, я не уверен, как заставить его записывать в файл так, как он в настоящее время выводится на консоль. Хотя это также означает просто выводить его в текстовый файл. Я бы предпочел не использовать pandas, если это возможно.
3. Изменение
for results2, results3, results4, results5 in zip(results2, results3, results4, results5):
вfor r2, r3, r4, r5 in zip(results2, results3, results4, results5):
том, что вы уже сделали, заключается в том, что после первого запуска этого цикла results2/3/4/5 перестаньте быть списками и станьте отдельными значениями.4. Хорошо, спасибо, это выводит в файл, теперь мне просто нужно разобраться, как его получить, чтобы он добавил все, прямо сейчас он просто добавляет 1 строку.
5. Я думаю, мне нужно изменить w на a, хех, нет, который по-прежнему добавляет только последний элемент в следующую строку, как я могу заставить его выводить информацию о каждом отдельном драйвере в отдельную строку?
Ответ №1:
Вот что у меня есть до сих пор, все еще есть некоторые проблемы, которые нужно решить, но я получил ответ от Ятина о том, чтобы все отображалось в файле csv:
from selenium import webdriver
import time
from bs4 import BeautifulSoup
import csv
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
with open(file_path, 'r') as f:
list = f.readlines()
for items in list:
driver = webdriver.Chrome('C:/temp/chromedriver_win32/chromedriver.exe')
driver.get(items)
time.sleep(3)
element = driver.find_element_by_xpath("//button[contains(.,'Show all')]").click();
page = driver.page_source
driver.close()
soup = BeautifulSoup(page,'html.parser')
results = soup.find(id='downloads-table')
results2 = results.find_all(class_='dl-desk-view')
results3 = results.find_all(class_='details-control sorting_1')
results4 = results.find_all(class_='details-control')
results5 = results.find_all(class_='btn-download-lg btn btn-sm no-break text-decoration-none dellmetrics-driverdownloads btn-outline-primary')
new_name = items.replace('https://www.dell.com/support/home/en-us/product-support/product/','').replace('/drivers','').replace('n','')
open('C:/temp/' new_name '.csv', "w").close
with open('C:/temp/' new_name '.csv', "a") as csvfile:
writer = csv.writer(csvfile)
for r2, r3, r4, r5 in zip(results2, results3, results4, results5):
writer.writerow([r2, r3, r4, r5])
Отмечу как ответ, когда смогу, не уверен, почему кто-то дал отрицательный ответ на мой вопрос, но не сказал, почему : /
Ответ №2:
Попробуйте выполнить итерацию по вашему архивному списку и записать каждую строку в файл csv. Вы можете добавить строку заголовка, записав ее в файл вне цикла.