#python #python-3.x #selenium #webdriver
Вопрос:
Я хочу получить таблицу с веб-страницы
import os
from webdriver_manager.chrome import ChromeDriverManager
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--start-maximized')
options.page_load_strategy = 'eager'
options.add_argument("--headless");
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 20)
driver.get("https://munafasutra.com/nse/dividends")
file_object = open('divident.csv', 'a')
выходная таблица
Как получить первую таблицу и их значения?
Ответ №1:
Вы должны посмотреть путь HTML и найти веб-элемент, который собирает эту первую таблицу (нажатие кнопки «Проверить» при нажатии правой кнопки мыши может выполнить эту работу).
Вы можете сохранить этот веб-элемент, используя следующую строку кода:
first_table = driver.find_element_by_xpath("//div[@id = 'co']//table[1]") # The [1] is not really necessary as when using **find_element_by_xpath** will only look for the first element.
Затем, если вы посмотрите, как организованы данные внутри этой таблицы, вы увидите, что каждая строка собирается веб-элементом tr. Поэтому, если вы хотите записать его в csv-файл, я бы предложил писать строку за строкой со следующим кодом:
rows = first_table.find_elements_by_xpath("./tbody/tr")
for row in rows:
entries_of_the_row = row.find_elements_by_xpath("./td")
row_to_csv = []
for entry in entries_of_the_row:
row_to_csv.append(entry.text)
file_object.write(f"{row_to_csv[0]}, {row_to_csv[1]}, {row_to_csv[2]}, {row_to_csv[3]}, {row_to_csv[4]}n")
file_object.close()
Комментарии:
1. одного «/» не хватало, чтобы найти стол. Теперь это исправлено.
2. одна скобка также отсутствует, но проблема решена. Спасибо @JorgeHB
Ответ №2:
Вы можете использовать приведенный ниже XPATH для получения первого табличного значения :
//h3[text()=' Earlier dividends announced by companies ']/preceding-sibling::table/descendant::td
Что-то вроде этого :
driver.get("https://munafasutra.com/nse/dividends")
first_table = driver.find_elements(By.XPATH, "//h3[text()=' Earlier dividends announced by companies ']/preceding-sibling::table/descendant::td")
for first in first_table:
print(first.text)
Комментарии:
1. значения не отображаются через запятую для каждой строки
Ответ №3:
Вы можете использовать BeautifulSoup для получения данных таблицы. Селен не требуется, если вы просто хотите извлечь данные веб-страницы.
Вам необходимо импортировать следующие пакеты :
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
Вы можете извлечь HTML-код таблицы, используя приведенный ниже код (переменная soup будет содержать HTML-код всей страницы).:
url_munafasutra = "https://munafasutra.com/nse/dividends"
html_munafasutra = urlopen(url_munafasutra)
soup = BeautifulSoup(html_munafasutra, 'html')
Ниже приведен код для извлечения HTML для 1-й таблицы (здесь таблица-значение тега, а в [] содержится индекс таблицы, из которой мы хотим извлечь данные):
first_table = soup.find_all('table')[0]
Вы также можете добавить атрибуты для четкой идентификации таблицы вместе с именем тега.
Ниже приведен код для извлечения всех строк в выбранной таблице :
all_rows = first_table.findAll("tr")
Используйте приведенный ниже код для записи данных в файл csv :
with open("C:\Users\abhay\.spyder-py3\table_extract.csv", "wt ", newline="") as f:
table_to_csv = csv.writer(f)
for row in all_rows:
row_data = []
for cell in row.findAll(["td", "th"]):
row_data.append(cell.get_text())
table_to_csv.writerow(row_data)
Ниже приведен полный код для извлечения данных 1-й таблицы в csv :
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
url_munafasutra = "https://munafasutra.com/nse/dividends"
html_munafasutra = urlopen(url_munafasutra)
soup = BeautifulSoup(html_munafasutra, 'html')
first_table = soup.find_all('table')[0]
all_rows = first_table.findAll("tr")
with open("C:\Users\abhay\.spyder-py3\table_extract.csv", "wt ", newline="") as f:
table_to_csv = csv.writer(f)
for row in all_rows:
row_data = []
for cell in row.findAll(["td", "th"]):
row_data.append(cell.get_text())
table_to_csv.writerow(row_data)