Python Selenium Цикл для парсинга таблицы в csv
www geeksforgeeks.org/scrape-and-save-table-data-in-csv-file-using-selenium-in-python/ ДЕЛАЛ ПО ЭТОМУ ПРИМЕРУ
Хочу сделать так, чтобы в .csv спарсились все данные таблицы. До момента "#ЦИКЛ ДЛЯ ПАРСИНГА КАЖДОЙ СТРОКИ" Всё работает, выводятся нужные строки из таблицы в консольку, все работает. Но как бы только я не писал цикл, никак не получается моя задумка записи каждой строки(( Смог сделать только так, что только либо первая строка уходит в .csv, либо вторая. Помогите пожалуйста с циклом, Делал две попытки, обе не работают
Консолька выдает то, что нужно
вот csv выдает только последнюю строку
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common import keys
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time
from tkinter import*
from tkinter import*
from tkinter import Frame, Tk, BOTH, Text, Menu, END
from tkinter import filedialog
import csv
import pandas as pd
from docx import Document
from random import choice
from docxtpl import DocxTemplate
from tkcalendar import DateEntry
import datetime
url = 'https://elibrary.ru/'
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
binary_yandex_driver_file = 'yandexdriver.exe' # path to YandexDriver
driver = webdriver.Chrome(binary_yandex_driver_file, options=options)
driver.get(url)
wait = WebDriverWait(driver, 10)
original_window = driver.current_window_handle
assert len(driver.window_handles) == 1
try:
xpath = '/html/body/table/tbody/tr/td/table[1]/tbody/tr/td[1]/table/tbody/tr[2]/td/div/div/table[2]/tbody/tr/td[2]/a'
elem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
elem.click()
xpath2 = '/html/body/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr/td/table[6]/tbody/tr[1]/td[3]/a'
elem2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath2)))
elem2.click()
wait.until(EC.number_of_windows_to_be(2))
for window_handle in driver.window_handles:
if window_handle != original_window:
driver.switch_to.window(window_handle)
break
form_xpath = '/html/body/center/form/table[1]/tbody/tr/td[1]/input'
elem3 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, form_xpath)))
print(elem3)
elem3.send_keys('Кромина Л А')
xpath4 = '/html/body/center/form/table[1]/tbody/tr/td[2]/table/tbody/tr/td[1]/a'
elem4 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath4)))
elem4.click()
time.sleep(4)
driver.switch_to.window(original_window)
select_element = driver.find_element(By.NAME, 'begin_year')
select = Select(select_element)
option_list = select.options
select.select_by_value('2021')
select_element = driver.find_element(By.NAME, 'end_year')
select = Select(select_element)
option_list = select.options
select.select_by_value('2024')
time.sleep(4)
xpath5 = '/html/body/table/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr/td/table[11]/tbody/tr/td[6]/a' #поиск
elem5 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath5)))
elem5.click()
l = driver.find_elements_by_xpath ('//*[@id="restab"]/tbody/tr')
# получаем количество строк
print(len(l))
lc = len(l)
#for z in l :
# выводим содержимое заголовка
#print(z.text)
s = driver.find_elements_by_xpath('//*[@id="restab"]/tbody/tr[1]/td[2]')
print(len(s))
sc = len(s)
for i in s :
# выводим содержимое заголовка
print(i.text)
for i in range(2, lc + 1):
# в цикле перебираем список столбцов из текущей строки
for j in range(1, sc + 1):
# получаем содержимое ячейки с помощью метода text
d = driver.find_element_by_xpath("//*[@id='restab']/tbody/tr["+str(i)+"]/td[1]").text
d1 = driver.find_element_by_xpath("//*[@id='restab']/tbody/tr["+str(i)+"]/td[2]").text
#ЦИКЛ ДЛЯ ПАРСИНГА КАЖДОЙ СТРОКИ
#2 ПОПЫТКА
templist = []
Table_dict = {
'Method': d,
'Description': d1}
templist.append(Table_dict)
df = pd.DataFrame(templist)
i+=1
print(d)
df.to_csv('table.csv')
#1 ПОПЫТКА
r = 1
templist = []
while(r==100):
try:
method = driver.find_element(By.XPATH, "//*[@id='restab']/tbody/tr["+str(r)+"]/td[1]").text
Desc = driver.find_element(By.XPATH, "//*[@id='restab']/tbody/tr["+str(r)+"]/td[2]").text
Table_dict = {
'Method': method,
'Description': Desc}
templist.append(Table_dict)
df = pd.DataFrame(templist)
r+=1
print(r)
except NoSuchElementException:
break
#df.to_csv('table.csv')
#root=Tk()
#root.title('Личнаякарточка')
#root.geometry('1298x960')
#root["bg"] = "white"
#label1=Label(text=d, font='TimesNewRoman 11', bg="white")
#label1.grid(row=0,column=0, sticky=S)
#doc = DocxTemplate("шаблон.docx")
#context = { 'номер1' : d, 'номер2' : d}
#doc.render(context)
#doc.save("шаблон-final.docx")
#root.mainloop()
finally:
driver.quit()
Источник: Stack Overflow на русском