Очистить данные таблицы со страницы. jsp с помощью Selenium - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь почистить таблицу со страницы. jsp (подробности ниже). Таблица загружается только после ввода данных (номер поезда и станция поездки)

Для ваших испытаний номер поезда может быть 56913 , а станция поездки может быть SB C (Это автоматически изменится на «KSR Bengaluru» после ввода данных.

С помощью приведенного ниже сценария я могу сгенерировать таблицу, однако не могу ее извлечь (распечатать результаты в пустом списке Мне нужно получить полную таблицу. Может ли кто-нибудь помочь с тем, чтобы узнать, как извлечь таблицу?

Я очень новичок в изучении веб-страниц. Следовательно, если я сделал какую-то базовую c ошибку, пожалуйста, слегка подтолкните меня в правильном направлении.

import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.firefox.options import Options
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

from bs4 import BeautifulSoup
import soupsieve as sv
import requests
# Activate the following line if you do not want to see the Firefox window.
# Better deactivate it for debugging.
# os.environ['MOZ_HEADLESS'] = '1'

url = 'https://enquiry.indianrail.gov.in/ntes/trainOnMapBh.jsp'

opts = Options()
driver = Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe", options=opts)
driver.get(url)
WebDriverWait(driver, 20)

train_field = driver.find_element_by_id("trnSrchTxt")
train_field.send_keys("56913")
time.sleep(2)
actions = ActionChains(driver)
actions.send_keys('SBC',Keys.ENTER)
actions.perform()

WebDriverWait(driver, 1)
result_table = driver.find_elements_by_id("mapTrnSch")
print(result_table)

Обновление Помимо ответа от @MadRay, следующий код также получает данные (не уверен, насколько они надежны).

import os
import time
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver import Firefox
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import re

os.environ['MOZ_HEADLESS'] = '1'
opts = Options()
driver = Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe", options=opts)
driver.get('https://enquiry.indianrail.gov.in/ntes/trainOnMapBh.jsp')
WebDriverWait(driver, 20)

train_field = driver.find_element_by_id("trnSrchTxt")
train_field.send_keys("11302")
time.sleep(2)
actions = ActionChains(driver)
actions.send_keys('SBC',Keys.ENTER)
actions.perform()
time.sleep(2)
res = driver.execute_script("return document.documentElement.outerHTML")
driver.quit()

soup = BeautifulSoup(res, 'lxml')
table_rows =soup.find_all('table')[3].find_all('tr')
rows=[]
for tr in table_rows:
    td = tr.find_all('td')
    rows.append([i.text for i in td])
delaydata = rows[3:]
import pandas as pd
df = pd.DataFrame(delaydata, columns = ['StopNo','Station',1,'SchArr','SchDep','ETA_ATA','Arr_Delay','ETD_ATD','DepDelay','Distance','PF'])
df

1 Ответ

1 голос
/ 23 января 2020

Вы должны искать результаты по имени класса, а не по идентификатору:

results = driver.find_elements_by_class_name("mapTrnSch")

Весь другой код работает хорошо.

Важное замечание . У вас будет два результата. Первый - для заголовков таблиц, второй - для содержимого таблиц.

Вот пример, который я написал без WebDriverWait и ActionChains:

import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

url = 'https://enquiry.indianrail.gov.in/ntes/trainOnMapBh.jsp'

driver = Firefox(firefox_binary=r"C:\Program Files (x86)\Mozilla Firefox\firefox.exe", options=opts)
driver.get(url)
time.sleep(5)

# Send search data
driver.find_element_by_id("trnSrchTxt").send_keys("56913")  # Train
time.sleep(5)
driver.find_element_by_id("jrnyStn").send_keys('SBC')  # Journey
time.sleep(5)
driver.find_element_by_id("searchTrainInMapBtn").click()  # Submit button (seems like we do not need to click on it, but let's click for sure)
time.sleep(5)

# Gain results
results = driver.find_elements_by_class_name("mapTrnSch")
print(results[0].text)  # 1st result for table headers
print(results[1].text)  # 2st result for table content

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...