Добавление табличных значений с веб-страницы в csv

#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)