Перевод статьи 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()