2017-07-30 89 views
0

我用Python编写一些代码与硒组合。我打算从网页解析表格。我有它的工作。但是,当我尝试点击下一页按钮时出现问题。刮板只从第一页,而不是点击下一步按钮它退出而不引发任何错误解析表。所以,我不明白我错过了什么。麻烦点击按钮,下一个

这是给你考虑全码:

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

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get("https://toolkit.financialexpress.net/santanderam") 

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

tab_data = driver.find_element_by_css_selector('table.fe-datatable') 

while True: 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'tr'))) 
    list_rows = [[cell.text for cell in row.find_elements_by_css_selector('td')] 
       for row in tab_data.find_elements_by_css_selector('tr')] 
    for data in list_rows: 
     print(data) 

    try: 
     driver.find_element_by_css_selector('a.ui-paging-next').click() 
    except: 
     break 

driver.quit() 

元素中的下一个页面按钮存在:

<div class="pagination ui-widget"><span class="ui-paging-current ui-state-default ui-state-disabled ui-corner-all ui-paging-prev">Prev</span><span class="ui-paging-current ui-state-default ui-state-disabled ui-state-highlight ui-corner-all">1</span><a class="ui-paging-button ui-state-default ui-corner-all" href="#">2</a><a class="ui-paging-button ui-state-default ui-corner-all" href="#">3</a><a class="ui-paging-button ui-state-default ui-corner-all" href="#">4</a><span class="ui-state-default ui-corner-all ui-state-disabled ui-paging-ellipse">...</span><a class="ui-paging-button ui-state-default ui-corner-all ep" href="#">7</a><a class="ui-paging-button ui-state-default ui-corner-all ui-paging-next" href="#">Next</a></div> 
+1

尝试driver.find_element_by_css_selector(“一[类* = 'UI-寻呼下一']“)。单击()或find_element_by_link_text( '下一步')。单击() – Grasshopper

+0

的Gr感谢蚂蚱,为你答案。它没有使用CSS选择器的技巧,但它似乎与链接文本。测试后会回复你。谢谢。 – SIM

+0

它确实点击链接,但会引发另一个错误。 “raise exception_class(message,screen,stacktrace) selenium.common.exceptions.StaleElementReferenceException:消息:陈旧的元素引用:元素没有附加到页面文档中” – SIM

回答

1

@Grasshopper已经提供了一个解决方案,但我会尽量让更多的细节让你明白,为什么你的代码没有

存在与出现在网页的源文件相同的HTML码两个环节:第一是隐藏的,第二(你需要的那个)不是。

您可以

print(len(driver.find_elements_by_css_selector('a.ui-paging-next'))) 

检查它虽然CSS选择器或XPath通过链接简单的返回你的第一次出现,搜索文本返回只可见文本链接:

print(len(driver.find_elements_by_link_text('Next'))) 

这就是为什么您find_element_by_css_selector(...)代码不起作用,但find_element_by_link_text(...)一样。

还要注意的是线

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

应该已返回你所需的元素,所以在

tab_data = driver.find_element_by_css_selector('table.fe-datatable') 

无需只需使用

tab_data = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

要避免遇到StaleElementReferenceException你应该每个iterarion为重新定义你的tab_data在第一页上定义的将不能在下一页上访问。只要把while循环内tab_data定义

UPDATE

在您的代码尝试更换

try: 
    driver.find_element_by_link_text('Next').click() 
except: 
    break 

first_row = driver.find_element_by_css_selector('table.fe-datatable tr.odd').text 
try: 
    driver.find_element_by_link_text('Next').click() 
except: 
    break 
wait.until(lambda driver: driver.find_element_by_css_selector('table.fe-datatable tr.odd').text != first_row) 
+0

我在第192行和我的脚本刚刚“for list_rows中的数据:”之前得到了该错误。仅供参考,在执行脚本之前,我在内部循环中使用了tab_data。我在一段时间内给出了我的纠正代码链接。谢谢先生。 – SIM

+0

这是脚本'现在尝试:“https://www.dropbox.com/s/kw71wircwbj5zv8/Rectified%20One.txt?dl=0” – SIM

+0

检查更新的代码 – Andersson