Извлечение данных из скрытой таблицы с помощью Selenium python

#python #selenium

#python #селен

Вопрос:

Я пытаюсь получить информацию о станции с веб-сайта: https://indiarailinfo.com/atlas

Таблица, которую я пытаюсь извлечь, представляет собой скрытую таблицу, которая появляется только при вводе текста в текстовое поле Скрытая таблица Ниже приведен код div, содержащий требуемую таблицу (класс таблицы = ‘dropdowntable»)

 <div style="top: 165px; left: 721px; display: none;" class="list hideslow">
<span style="display:none">LappGetStationList/nzm/0/1/0?amp;amp;date=1601890451781amp;amp;seq=9</span>
<table class="dropdowntable" numrows="1" cellspacing="0"><tbody><tr class="rowM1" rownum="0"><td style="display:none">748</td><td class="rcol" nowrap=""><span><span class="listmatch">NZM</span></span></td><td class="icol" nowrap=""><span>Hazrat Nizamuddin</span></td><td class="jcol" nowrap=""><span>NR-Old Delhi Div</span></td><td style="display:none;">NZM/Hazrat Nizamuddin</td></tr><tr class="rowm2" rownum="0"><td style="display:none">748</td><td><span nowrap="">amp;nbsp;</span></td><td colspan="2" nowrap=""><span>Nizamuddin East/Sarai KaleKhan Bus Terminal 110013 Delhi NCT</span></td><td style="display:none">NZM/Hazrat Nizamuddin</td></tr><tr><td class="listfooter" colspan="5"><span width="10%" class="listfooterhidden">prev</span>amp;nbsp;amp;nbsp;<span width="10%" class="listfooterhidden">next</span>amp;nbsp;amp;nbsp;</td></tr><tr><td>amp;nbsp;</td></tr></tbody></table>

</div>
  

Я попытался выполнить поиск в таблице по классу, но ничего не получилось. Любые предложения приветствуются.

Обновление 1:

Вот код, с которым я работаю:

 driver = webdriver.Chrome()    
driver.get('https://indiarailinfo.com/atlas')
searchBox = driver.find_element(By.ID, 'TrkStnListBox')
searchBox.send_keys(code)
searchBox.click()
  

Подходы, которые я пробовал:

 1.dropDownTable = driver.find_element(By.PARTIAL_LINK_TEXT,'LappGetStationList')
2.dropDownTable = driver.find_element(By.CLASS_NAME,'list hideslow')
  

Теперь у меня возникают проблемы со следующим:

 # hidden = driver.find_element(By.XPATH,"//input[@id='']")
driver.execute_script("arguments[0].setAttribute('style','visibility:visible;');", hidden)
driver.execute_script("arguments[0].click();", dropDownTable)
dropDownTableBody = dropDownTable.find_element(By.TAG_NAME,'tbody')
for entry in dropDownTableBody.find_elements(By.TAG_NAME,'tr'):
        if entry.get_attribute('rownum')==0 and entry.get_attribute('class')=='rowM1':
            for item in entry.find_elements(By.TAG_NAME,'td'):
                if item.get_attribute('class')=='icol':
                    station.update({
                        'STATION NAME' : decodeText(item)
                    })
                if item.get_attribute('class')=='jcol':
                    list = decodeText(item).split('-')
                    division = list[1][:list[1].find('Div')]
                    station.update({
                        'RAILWAY ZONE' : list[0],
                        'RAILWAY DIVISION' : division
                    })
            print(station)
  

Комментарии:

1. ваш код будет полезен для определения того, что не так. Спасибо

Ответ №1:

Я пробовал с chrome браузером, надеюсь, это сработает и для FF браузера.

После вставки текста в поле поиска вам нужно дождаться заполнения таблицы, это поле автозаполнения.

Индуцировать WebDriverWait () и ждать visibility_of_element_located () Некоторые данные таблицы скрыты, поэтому вместо текста используйте get_attribute("textContent")

Код:

 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Chrome()
driver.get("https://indiarailinfo.com/atlas")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"TrkStnListBox"))).send_keys("nzm")
table=WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,'table.dropdowntable')))
for row in table.find_elements_by_xpath("./tbody/tr")[:2]:
    for col in row.find_elements_by_xpath("./td"):
        print(col.get_attribute("textContent"))
  

Вывод на консоль:

 748
NZM
Hazrat Nizamuddin
NR-Old Delhi Div
NZM/Hazrat Nizamuddin
748
 
Nizamuddin East/Sarai KaleKhan Bus Terminal 110013 Delhi NCT
NZM/Hazrat Nizamuddin
  

Надеюсь, это то, что вам нужно.

Комментарии:

1. Спасибо!! Это сработало как шарм. Качая головой, почему я не подумал о реализации wait.

Ответ №2:

Я смог принести стол с

 # Go to the website
driver = webdriver.Firefox()
driver.get("https://indiarailinfo.com/atlas")

# Send the search term
driver.find_element(By.ID, "TrkStnListBox").send_keys("nzm")
time.sleep(1)

# Read the Table
el = driver.find_element(By.CLASS_NAME, "dropdowntable")
  

Но я не смог получить информацию в таблице даже после поиска тегов «td» и «span» в el переменной. Может быть, кто-то может взять это отсюда.

Редактировать: добавлен комментарий ожидания, чтобы убедиться, что таблица готова.

Комментарии:

1. Это работает для вас? Я не могу найти элемент

2. Yepi, у меня это работает. Можете ли вы увидеть, как открывается окно Firefox (или Chrome, если вы его используете) и вводится «nzm» в поле поиска?

3. Ну, это не совсем «работает», выборка таблицы выдает исключение «элемент не найден», другие вещи работают, да.

4. Иногда это работает, а иногда нет. Я добавил комментарий sleep, чтобы исправить это.