Перевод статьи How To Handle Web Tables in Selenium Python.

Как вы, конечно же, знаете разметка веб-таблицы в HTML-документе определяется тегом <table>. Строки таблицы представлены тегом <tr>, а столбцы — <td>. В большинстве случаев каждая таблица также содержит заголовки, разметка которых определяется тегом <th>.

Для примера рассмотрим следующую таблицу.

И так, для того, чтобы получить и обработать данные, которые содержит веб-таблица, мы должны иметь возможность выполнять следующие действия:

  • получение общего числа ее строк и столбцов,
  • получение значения ее отдельной ячейки,
  • выборки значений всех ячеек в строке,
  • выборки значений всех ячеек в столбце,
  • выборки значений всех ячеек и так далее.

Для того, чтобы рассчитать общее число строк в таблице, сначала сформируем xpath запрос для выборки всех ее строк с использованием метода find_elements_by_xpath(). И поскольку этот метод возвращает список элементов, то получим количество строк с помощью метода len().

Пример кода для получения числа строк в таблице представлен ниже.

# импортируем webdriver 
from selenium import webdriver 
# импортируем класс Keys 
from selenium.webdriver.common import keys 
driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe") 
# используем метод get для получения страницы по URL 
driver.get("https://www.softwaretestingmaterial.com/sample-webpage-to-automate/") 
# получаем список всех строк таблицы 
l = driver.find_elements_by_xpath ("//*[@class= 'spTable']/tbody/tr") 
# получаем количество строк 
print(len(l))  
# по окончанию работы закроем браузер
driver.quit()

Чтобы получить общее количество столбцов таблицы, сначала, по аналогии со строками, сформируем соответствующий xpath запрос, а затем используем тот же метод find_elements_by_xpath(). И поскольку этот метод вернет список элементов, то мы получим количество столбцов опять же с помощью метода len().

Как видим, для этого достаточно исправить в предыдущем xpath запросе <tr> на <td>. Отметим, что если в нашей таблице используется оглавление, которое мы видим в ее первой строке, то мы должны использовать тег <th> для получения числа ее столбцов. Далее же для получения значений из любой другой строки, кроме первой, мы должны использовать тег <td>.

Пример кода для получения числа столбцов в таблице представлен ниже.

# импортируем webdriver 
from selenium import webdriver 
# импортируем класс Keys 
from selenium.webdriver.common import keys 
driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe") 
# используем метод get  для получения страницы по URL
driver.get("https://www.softwaretestingmaterial.com/sample-webpage-to-automate/") 
# получаем список всех столбцов из третьей строки таблицы 
l = driver.find_elements_by_xpath("//*[@class= 'spTable']/tbody/tr[3]/td") 
# получаем количество столбцов 
print(len(l))  
# по окончанию работы закроем браузер 
driver.quit()

Для того, чтобы получить содержимое заголовков таблицы создадим xpath запрос и получим список элементов всех строк с использованием метода find_elements_by_xpath(). Как мы уже знаем этот метод возвращает список. Нам же необходимо получить из него первую строку, а затем выбрать из нее элементы с тегом <th>.

Пример кода для получения содержимого заголовков таблицы представлен ниже. После выбора первой строки, в цикле for выведем в консоли соответствующее текстовое значение text, содержимого каждой отдельной ячейки с заголовком столбца таблицы.

# импортируем webdriver 
from selenium import webdriver 
# импортируем класс Keys  
from selenium.webdriver.common import keys 
driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe") 
# используем метод get  для получения страницы по URL
driver.get("https://www.softwaretestingmaterial.com/sample-webpage-to-automate/") 
# получим из первой строки таблицы ее заголовки 
l = driver.find_elements_by_xpath ("//*[@class= 'spTable']/tbody/tr[1]/th") 
# перебираем список заголовков таблицы 
for i in l : 
    # выводим содержимое заголовка 
    print(i.text) 
# по окончанию работы закроем браузер 
driver.close()

Чтобы получить содержимое всех ячеек таблицы, сначала сформируем xpath запрос для получения всех строк и столбцов таблицы с помощью метода find_elements_by_xpath(). Поскольку этот метод возвращает список, то мы также можем получить число строк и столбцов с помощью метода len(). Теперь нам нужно перебирать каждую строку и каждый столбец соответствующей части (с нужными нам данными) таблицы, а затем получить текст из каждой ячейки с помощью метода text.

Пример кода для получения всех данных из ячеек таблицы представлен ниже.

# импортируем webdriver
from selenium import webdriver
# импортируем класс Keys
from selenium.webdriver.common import keys
driver = webdriver.Chrome (executable_path="C:\\chromedriver.exe")
# используем метод get  для получения страницы по URL
u = "https://www.softwaretestingmaterial.com/sample-webpage-to-automate/"
driver.get(u)
# получим все строки таблицы
r = driver.find_elements_by_xpath("//table[@class='spTable']/tbody/tr")
# получим все столбцы таблицы
c = driver.find_elements_by_xpath("//*[@class='spTable']/tbody/tr[3]/td")
# получим количество строк с помощью метода len 
rc = len(r)
# получим количество столбцов
cc = len(c)
# в цикле перебираем список со строками за исключением строки с заголовками
for i in range(2, rc + 1):
# в цикле перебираем список столбцов из текущей строки 
	for j in range(1, cc + 1):
# получаем содержимое ячейки с помощью метода text
		d = driver.find_element_by_xpath("//tr["+str(i)+"]/td["+str(j)+"]").text
		print(d)
# по окончанию работы закроем браузер 
driver.close()

Для того, чтобы найти нужный текст в какой-либо из ячеек таблицы, сначала сформируем xpath запрос для получения всех ее строк и столбцов с помощью метода find_elements_by_xpath(). И поскольку этот метод возвращает список элементов, то мы можем получить количество строк и столбцов с помощью метода len(). Далее будем перебирать элементы нашей таблицы построчно, а каждую строку по столбцам (то есть фактически по ячейкам). Текстовые данные конкретной ячейки получим с помощью метода text. Теперь, как только мы можем получить данные из ячеек, проверим соответствие их содержимого тексту, который ищем, с помощью функции xpath text().

# импортируем webdriver
from selenium import webdriver
# импортируем класс Keys
from selenium.webdriver.common import keys
driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe")
# используем метод get  для получения страницы по URL
u = "https://www.softwaretestingmaterial.com/sample-webpage-to-automate/"
driver.get(u)
# получим все строки таблицы
r = driver.find_elements_by_xpath ("//table[@class= 'spTable']/tbody/tr")
# получим все столбцы таблицы
c = driver.find_elements_by_xpath ("//*[@class= 'spTable']/tbody/tr[3]/td")
# получим количество строк с помощью метода len d
rc = len(r)
# получим количество столбцов
cc = len(c)
# в цикле перебираем список со строками за исключением строки с заголовками
for i in range(2, rc + 1) :
# в цикле перебираем список столбцов из текущей строки
	for j in range(1, cc + 1) :
		# получаем содержимое ячейки с помощью метода text
		d = driver.find_element_by_xpath("//tr["+str(i)+"]/td["+str(j)+"]").text
		# проверяем соответствие текста ячейки искомому
		m = driver.find_elements_by_xpath("//td[text() = 'EID001']")
		# определяем количество совпадений искомого текста
		s = len(m)
		# проверяем были ли совпадения
		If(s > 0) :
			print ("Text found")
# по окончанию работы закроем браузер 
driver.close()

Чтобы получить текстовое содержимое определенной ячейки таблицы, необходимо сформировать соответствующий xpath запрос для получения элемента нужной ячейки с помощью метода find_element_by_xpath().

В примере кода ниже показано, как это можно сделать.

# импортируем webdriver
from selenium import webdriver
# импортируем класс Keys
from selenium.webdriver.common import keys
driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe")
# используем метод get  для получения страницы по URL
u = "https://www.softwaretestingmaterial.com/sample-webpage-to-automate/"
driver.get(u)
# получим элемент ячейки в третьей строке втором столбце
c = driver.find_element_by_xpath("//*[@class= 'spTable']/tbody/tr[3]/td[2]")
# выведем текстовое содержимое ячейки
print(c.text)
# по окончанию работы закроем браузер 
driver.close()

Оставить комментарий