Python, Selenium. Цикл для парсинга таблицы в csv
Хочу сделать так, чтобы в .csv спарсились все данные таблицы. До момента "#ЦИКЛ ДЛЯ ПАРСИНГА КАЖДОЙ СТРОКИ" Всё работает, выводятся нужные строки из таблицы в консольку, все работает. Но как бы только я не писал цикл, никак не получается моя задумка записи каждой строки((
Смог сделать только так, что только первая строка уходит в .csv, (но в код не добавлял)
Помогите пожалуйста с циклом, программа больше часа не может завершить процесс
P.S. ПОСЛЕ ДОБАВКИ print(r)
while(1):
try:
method = driver.find_element(By.XPATH, "//*[@id='restab']/tbody/tr["+str(i)+"]/td[1]").text
Desc = driver.find_element(By.XPATH, "//*[@id='restab']/tbody/tr["+str(i)+"]/td[2]").text
Table_dict = {
'Method': method,
'Description': Desc}
templist.append(Table_dict)
df = pd.DataFrame(templist)
r+=1
print(r)
except NoSuchElementException:
break
КОД
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
print(d)
#ЦИКЛ ДЛЯ ПАРСИНГА КАЖДОЙ СТРОКИ
r = 1
templist = []
while(1):
try:
method = driver.find_element(By.XPATH, "//*[@id='restab']/tbody/tr["+str(i)+"]/td[1]").text
Desc = driver.find_element(By.XPATH, "//*[@id='restab']/tbody/tr["+str(i)+"]/td[2]").text
Table_dict = {
'Method': method,
'Description': Desc}
templist.append(Table_dict)
df = pd.DataFrame(templist)
r+=1
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 на русском