Мне нужна помощь, чтобы выяснить, как вывести конечный результат этого python в csv

#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. Вы можете добавить строку заголовка, записав ее в файл вне цикла.