Python/Selenium web Очистка JS-таблицы без использования данных JSON

Я хочу очистить таблицу от:

https://www2.sgx.com/securities/annual-reports-financial-statements

Я понимаю, что это возможно, изучив заголовки и найдя такие вызовы API: https://api.sgx.com/financialreports/v1.0?pagestart=3&pagesize=250&params=id,companyName,documentDate,securityName,title,url но мне было интересно, можно ли получить все данные из таблицы, не делая этого, так как мне нужно будет проанализировать 16 файлов JSON.

При попытке очистки с помощью Selenium я могу добраться только до конца видимой таблицы (таблица становится намного больше, когда вы нажимаете «Очистить все» с левой стороны, это все данные, которые мне нужны).

Любые идеи приветствуются!

Обновлено: Вот код, который возвращает только 144 ячейки из тысяч в таблице.

from time import sleep  # to wait for stuff to finish.
from selenium import webdriver  # to interact with our site.
from selenium.common.exceptions import WebDriverException  #  url is wrong
from webdriver_manager import chrome  # to install and find the chromedriver executable


BASE_URL = 'https://www2.sgx.com/securities/annual-reports-financial-statements'
driver = webdriver.Chrome(executable_path=chrome.ChromeDriverManager().install())
driver.maximize_window()

try:
    driver.get(BASE_URL)
except WebDriverException:
    print("Url given is not working, please try again.")
    exit()

# clicking away pop-up
sleep(5)
header = driver.find_element_by_id("website-header")
driver.execute_script("arguments[0].click();", header)

# clicking the clear all button, to clear the calendar
sleep(2)
clear_field = driver.find_element_by_xpath('/html/body/div[1]/main/div[1]/article/template-base/div/div/sgx-widgets-wrapper/widget-filter-listing/widget-filter-listing-financial-reports/section[2]/div[1]/sgx-filter/sgx-form/div[2]/span[2]')
clear_field.click()

# clicking to select only Annual Reports
sleep(2)
driver.find_element_by_xpath("/html/body/div[1]/main/div[1]/article/template-base/div/div/sgx-widgets-wrapper/widget-filter-listing/widget-filter-listing-financial-reports/section[2]/div[1]/sgx-filter/sgx-form/div[1]/div[1]/sgx-input-select/label/span[2]/input").click()
sleep(1)
driver.find_element_by_xpath("//span[text()='Annual Report']").click()

rows = driver.find_elements_by_class_name("sgx-table-cell")
print(len(rows))

Выберите все классы sgx-table-cell и получите данные в тегах в виде списка. Затем вы можете построить фрейм данных, используя список. Без кода это лучшее, что я могу сделать.

Edeki Okoh 06.03.2019 20:48

Спасибо, я пытался это сделать, но я могу получить только те элементы, которые видны на странице. Отправка браузеру клавиши PageDown не работает, так как это не влияет на таблицу.

MrJones 06.03.2019 21:02

Что вы пробовали? Трудно понять, почему что-то не работает, если мы не можем видеть, что вы пробовали до сих пор. Пожалуйста, опубликуйте свой сценарий.

Edeki Okoh 06.03.2019 21:03

Вопросы, требующие помощи в отладке («почему этот код не работает?»), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См.: минимальный воспроизводимый пример

QHarr 06.03.2019 21:08

Только что отредактировал мой вопрос и добавил пример кода, мои извинения

MrJones 06.03.2019 21:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
212
1

Ответы 1

Я знаю, что вы просили не использовать API. Я думаю, что это подход намного чище.

(Выход 3709 документов)

import requests

URL_TEMPLATE = 'https://api.sgx.com/financialreports/v1.0?pagestart = {}&pagesize=250&params=id%2CcompanyName%2CdocumentDate%2CsecurityName%2Ctitle%2Curl'

NUM_OF_PAGES = 16
data = []
for page_num in range(1, NUM_OF_PAGES):
    r = requests.get(URL_TEMPLATE.format(page_num))
    if r.status_code == 200:
        data.extend(r.json()['data'])
print('we have {} documents'.format(len(data)))
for doc in data:
    print(doc)

Спасибо, я уже написал код для этого, но я надеялся найти решение и с помощью Selenium. В основном из любопытства! :)

MrJones 06.03.2019 22:20

Использование API или парсинг? С API у вас есть ~ 10 строк кода. Сколько у вас строк со скрейпингом? При очистке ваш код будет сломан, как только что-то изменится в разметке. Пример: класс sgx-table-cell был переименован.

balderman 06.03.2019 22:23

Другие вопросы по теме