#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, чтобы исправить это.