Python Selenium 点击加载更多 table
Python Selenium click load more on table
我正在尝试获取 this table 的全部数据。但是,在最后一行中有“加载更多”table 行,我不知道如何加载。到目前为止,我已经尝试了不同的方法,但都没有用,
- 我试图通过这个点击行本身:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
table = soup.find('table', {"class": "competition-leaderboard__table"})
i = 0
for team in table.find.all('tbody'):
rows = team.find_all('tr')
for row in rows:
i = i + 1
if (i == 51):
row.click()
//the scraping code for the first 50 elements
上面的代码抛出一个错误,指出“'NoneType' 对象不可调用”。
另一件我试过但没有用的东西是:
我试图通过它的class加载更多table行并点击它。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
load_more = driver.find_element_by_class_name('competition-leaderboard__load-more-wrapper')
load_more.click()
soup = BeautifulSoup(driver.page_source, 'html.parser')
上面的代码也不起作用。
所以我的问题是如何让 python 单击“加载更多”table 行,就像在 site 的 HTML 结构中一样“加载更多”不是可点击的按钮。
在您的代码中,您必须先接受 cookie,然后才能单击 'Load more' 按钮。
CSS 选择器最适合这种情况。
import time
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(executable_path='/snap/bin/chromium.chromedriver')
driver.implicitly_wait(10)
driver.get('https://www.kaggle.com/c/coleridgeinitiative-show-us-the-data/leaderboard')
wait = WebDriverWait(driver, 30)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".sc-pAyMl.dwWbEz .sc-AxiKw.kOAUSS>.sc-AxhCb.gsXzyw")))
cookies = driver.find_element_by_css_selector(".sc-pAyMl.dwWbEz .sc-AxiKw.kOAUSS>.sc-AxhCb.gsXzyw").click()
load_more = driver.find_element_by_css_selector(".competition-leaderboard__load-more-count").click()
time.sleep(10) # Added for you to make sure that both buttons were clicked
driver.close()
driver.quit()
我测试了这段代码,它点击了所需的按钮。
请注意,我添加了 WebDriverWait
以等待第一个按钮可点击。
更新:
我添加了 time.sleep(10) 这样您就可以看到两个按钮都被单击了。
我正在尝试获取 this table 的全部数据。但是,在最后一行中有“加载更多”table 行,我不知道如何加载。到目前为止,我已经尝试了不同的方法,但都没有用,
- 我试图通过这个点击行本身:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
table = soup.find('table', {"class": "competition-leaderboard__table"})
i = 0
for team in table.find.all('tbody'):
rows = team.find_all('tr')
for row in rows:
i = i + 1
if (i == 51):
row.click()
//the scraping code for the first 50 elements
上面的代码抛出一个错误,指出“'NoneType' 对象不可调用”。
另一件我试过但没有用的东西是: 我试图通过它的class加载更多table行并点击它。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
load_more = driver.find_element_by_class_name('competition-leaderboard__load-more-wrapper')
load_more.click()
soup = BeautifulSoup(driver.page_source, 'html.parser')
上面的代码也不起作用。
所以我的问题是如何让 python 单击“加载更多”table 行,就像在 site 的 HTML 结构中一样“加载更多”不是可点击的按钮。
在您的代码中,您必须先接受 cookie,然后才能单击 'Load more' 按钮。
CSS 选择器最适合这种情况。
import time
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(executable_path='/snap/bin/chromium.chromedriver')
driver.implicitly_wait(10)
driver.get('https://www.kaggle.com/c/coleridgeinitiative-show-us-the-data/leaderboard')
wait = WebDriverWait(driver, 30)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".sc-pAyMl.dwWbEz .sc-AxiKw.kOAUSS>.sc-AxhCb.gsXzyw")))
cookies = driver.find_element_by_css_selector(".sc-pAyMl.dwWbEz .sc-AxiKw.kOAUSS>.sc-AxhCb.gsXzyw").click()
load_more = driver.find_element_by_css_selector(".competition-leaderboard__load-more-count").click()
time.sleep(10) # Added for you to make sure that both buttons were clicked
driver.close()
driver.quit()
我测试了这段代码,它点击了所需的按钮。
请注意,我添加了 WebDriverWait
以等待第一个按钮可点击。
更新: 我添加了 time.sleep(10) 这样您就可以看到两个按钮都被单击了。