我在python中与selenium一起编写了一些代码。我打算从网页解析表格。我有它的工作。但是,当我尝试单击下一页按钮时出现问题。刮刀只从第一页解析表,而不是单击下一个按钮而退出而不会抛出任何错误。所以,我无法理解我所缺少的东西。
以下是供您考虑的完整代码:
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>
答案 0 :(得分:1)
@Grasshopper已经提供了解决方案,但我会尝试提供更多详细信息,以便您了解代码失败的原因
页面源中存在两个具有相同HTML
代码的链接:第一个是隐藏的,第二个(您需要的那个)不是。
您可以使用
进行检查print(len(driver.find_elements_by_css_selector('a.ui-paging-next')))
虽然css-selector或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
,您应该在每个迭代中重新定义tab_data
,因为在第一页上定义的tab_data
将无法在下一页上访问。只需将tab_data
定义放在while
循环
更新
在您的代码中尝试替换
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)