Это Selenium с python. Эти первые строки работают нормально.Ошибка Selenium при попытке извлечь данные из веб-таблицы
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.palottery.state.pa.us/Games/Past-Winning-Numbers.aspx?id=8')
elm = browser.find_element_by_xpath(".//*[@id='p_lt_zoneMain_pageplaceholder1_p_lt_zoneContent_pageplaceholder_p_lt_zoneContent_PaLotteryPastWinningNumbers_Button1']")
elm.click()
elm2 = browser.find_element_by_xpath(".//*[@id='page-content']/div[2]/div/a/img")
elm2.click()
browser.implicitly_wait(10)
Здесь я получаю ошибку
Dtable = browser.find_element_by_xpath('.//*[@id="p_lt_zoneLeft_PaLotteryPastWinningNumbers_Results"]/tbody')
for i in Dtable.find_elements_by_xpath('.//tr'):
print(i.get_attribute('innerHTML'))
elenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":".//*[@id=\"p_lt_zoneLeft_PaLotteryPastWinningNumbers_Results\"]/tbody"}
UPDATE: Я до сих пор не может получить все 250 строк таблицы. Я получаю только 10 строк по какой-то причине ...
DEF getWinNums():
l = []
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.palottery.state.pa.us/Games/Past-Winning-Numbers.aspx?id=8')
elm = browser.find_element_by_xpath(".//*[@id='p_lt_zoneMain_pageplaceholder1_p_lt_zoneContent_pageplaceholder_p_lt_zoneContent_PaLotteryPastWinningNumbers_Button1']")
elm.click()
elm2 = browser.find_element_by_xpath(".//*[@id='page-content']/div[2]/div/a/img")
elm2.click()
browser.implicitly_wait(10)
Dtable = browser.find_element_by_xpath(".//*[@id='page-content']//table/tbody")
# create list were elements are dates followed by 5 numbers for that date
l = [i.text.strip() for i in Dtable.find_elements_by_xpath('.//td') if i.text != "Payout"]
browser.close()
# convert list into list of tuples (date, 5 numbers)
l = zip(*[iter(l)]*2)
return l
Защиту основной():
l = getWinNums()
for el in l:
print(el)
если имя == "главный ": main()
OUTPUT:
('09/08/2015' , '2 32 35 36 39')
('09/07/2015' , '14 17 19 24 43')
('09/06/2015' , '10 13 15 36 38 ')
('09/05/2015', '4 5 24 29 34')
('09/04/2015' , «1 12 18 34 36 ')
('09/03/2015', '4 9 15 28 40')
('09/02/2015' , '14 16 17 18 34 ')
('09/01/2015', '7 26 33 36 41')
('08/31/2015' , '17 20 22 32 41 ')
('08/30/2015', '11 14 23 24 38')
ОБНОВЛЕНИЕ # 2
селектор CSS работает, как показано ниже, но снова Dtable.find_elements_by_xpath ('.// td') производит только 10 строк из 251.
Dtable = browser.find_element_by_css_selector ("таблица> TBODY")
UPDATE # 3
Теперь я могу получить 50 строк таблицы с этим
for i in range(1,6):
link3 = browser.find_element_by_xpath(".//*[@id='p_lt_zoneMain_pageplaceholder1_p_lt_zoneContent_pageplaceholder_p_lt_zoneContent_PaLotteryPastWinningNumbers_Results_paginate']/span/a[{i}]".format(i=i))
link3.click()
Dtable = browser.find_element_by_css_selector("table>tbody>tr")
l = [i.text.strip() for i in Dtable.find_elements_by_xpath('//td') if i.text != "Payout"]
l_result += l
Остальные проблемы как добраться до следующих 50 строк, нажав кнопку разбивки на страницы. Я могу получить xpath для кнопки, это: .// * [@ id = 'p_lt_zoneMain_pageplaceholder1_p_lt_zoneContent_pageplaceholder_p_lt_zoneContent_PaLotteryPastWinningNumbers_Results_next'] , но нажимать на него и повторять цикл выше, не создает никаких новых строк из таблицы.
спасибо! Больше ошибок. Я добавил/td в цикл и теперь получаю даты, но цифры для каждой даты не извлекаются чисто. Они чередуются с Есть ли способ извлечь номера с заявлением селена? – LetzerWille
просто используйте i.text вместо атрибута – Saifur
i.text сделал это! еще раз спасибо. Но таблица имеет 250 строк:/tbody/tr [1]/td [2] -/tbody/tr [250]/td [2], но сценарий печатает только 8. Это из-за @ id = 'page- контент '? – LetzerWille