2015-09-08 6 views
3

Это 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'] , но нажимать на него и повторять цикл выше, не создает никаких новых строк из таблицы.

ответ

2

Я думаю, что вы хотите изменить селектор для извлечения таблицы отображается следующим образом:

Dtable = browser.find_element_by_xpath('.//*[@id="p_lt_zoneLeft_PaLotteryPastWinningNumbers_Results"]/tbody') 

к:

Dtable = browser.find_element_by_css_selector("table[id^='p_lt_zoneLeft']") 
+0

спасибо! Больше ошибок. Я добавил/td в цикл и теперь получаю даты, но цифры для каждой даты не извлекаются чисто. Они чередуются с   Есть ли способ извлечь номера с заявлением селена? – LetzerWille

+0

просто используйте i.text вместо атрибута – Saifur

+0

i.text сделал это! еще раз спасибо. Но таблица имеет 250 строк:/tbody/tr [1]/td [2] -/tbody/tr [250]/td [2], но сценарий печатает только 8. Это из-за @ id = 'page- контент '? – LetzerWille