【问题标题】:Trouble clicking on the button for the next page无法单击下一页的按钮
【发布时间】:2017-07-30 10:07:57
【问题描述】:

我在 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>

【问题讨论】:

  • 试试 driver.find_element_by_css_selector("a[class*='ui-paging-next']").click() 或 find_element_by_link_text('Next').click()
  • 感谢蚱蜢,为您解答。它没有使用 css 选择器来解决问题,但它似乎正在使用链接文本。测试后会回复你。谢谢。
  • 它确实点击了链接,但引发了另一个错误。 " raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attach to the page document"
  • @SMth80,您在哪一行得到异常?

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案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)

【讨论】:

  • 我在第 192 行和脚本中“for data in list_rows:”之前遇到了这个错误。仅供参考,在执行脚本之前,我将 tab_data 放入循环中。稍后,我将提供一个链接,其中包含我的更正代码。谢谢先生。
  • 这是正在尝试的脚本:“dropbox.com/s/kw71wircwbj5zv8/Rectified%20One.txt?dl=0
  • 你是无敌的安德森爵士。一如既往的完美。你能给出一个单线解释,让我明白你在那里做了什么吗?再次感谢您完美的解决方案。
  • 当您单击“下一步”按钮时,您只是发送新的 XHR,因此页面实际上并没有完全重新加载,而只是表。您会看到 spiner (loader) 出现,您需要等到它消失并加载新数据,但是 selenium 在单击后立即尝试搜索表并且不等待表更新。所以它会返回相同的尚未重新加载的table。我添加了一些行,允许您等到第一行的文本更新(不等于先前的值)。我猜这不是最好的解决方案,但它应该可以工作
  • 安德森爵士,当您有空时,您可以追踪此链接:“stackoverflow.com/questions/45401274/…”提前致谢。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2021-05-08
相关资源
最近更新 更多