使用Beautiful Soup爬取时如何点击下一页按钮更新表格内容
解决前端本地分页的数据爬取问题
点击下一页无网络请求,说明这是前端本地分页——所有数据已经一次性加载到页面中,只是通过JS/CSS控制显示/隐藏不同页面的内容,而非通过新的网络请求获取下一页数据。以下是几种可行的解决方法:
方法1:直接提取页面中所有隐藏的数据
因为所有数据都在初始HTML里,无需模拟点击分页,直接用BeautifulSoup提取全部目标元素即可:
import requests from bs4 import BeautifulSoup target_url = "https://www.fi.se/sv/vara-register/blankningsregistret/emittent/?id=529900JY9ZBGUXGRKQ86" resp = requests.get(target_url) soup = BeautifulSoup(resp.text, "html.parser") # 替换为你要提取的数据对应的标签/类名,比如表格行、条目div等 all_entries = soup.find_all("tr", class_="table-row") # 示例选择器,需根据实际页面调整 for entry in all_entries: # 提取条目内的具体字段,比如文本、链接等 print(entry.get_text(strip=True))
验证方式:右键页面→查看页面源代码,搜索第二页中的某条数据内容,如果能找到,说明此方法有效。
方法2:从页面的JS变量中提取数据
如果数据是通过JS动态渲染(但未发请求),可能会以JSON形式存储在页面的<script>标签中,可通过正则提取:
import requests import re import json resp = requests.get(target_url) # 匹配存储数据的JS变量,需根据页面源码调整变量名 data_pattern = re.compile(r"var\s+registrationData\s*=\s*(.*?);", re.DOTALL) match_result = data_pattern.search(resp.text) if match_result: raw_json = match_result.group(1) # 转换为Python可处理的对象 parsed_data = json.loads(raw_json) # 遍历处理数据 for item in parsed_data: print(item)
方法3:用Selenium模拟浏览器分页(万不得已时用)
如果上述两种方法都无法获取数据,可使用Selenium模拟真实浏览器的点击操作,执行JS渲染分页:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() # 需提前配置ChromeDriver环境 driver.get(target_url) while True: # 提取当前页数据,替换为实际元素选择器 current_page_data = driver.find_elements(By.CLASS_NAME, "entry-item") for item in current_page_data: print(item.text) # 尝试点击下一页按钮,替换为实际按钮的选择器 try: next_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "a.pagination-next")) ) next_button.click() except: # 无下一页时退出循环 break driver.quit()

内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

