网页表格爬取故障:<tr>及ID方法无法生效的技术求助
解决Kontan网站基金灰色表格爬取问题
我来帮你搞定这个爬取表格的问题~你遇到的情况大概率是选择器不够精准或者表格数据是动态加载导致的,下面给你两种可行的解决方案:
先分析问题根源
你之前用<tr>和ID方法失败,可能有几个原因:
- 目标表格没有唯一ID,靠ID定位根本找不到元素;
- 直接用
<tr>标签范围太广,会匹配到页面上所有表格行,无法精准锁定目标表格; - 更关键的是,这个网站的表格数据可能是通过JavaScript动态加载的,静态请求(比如你用的
urllib.request)拿不到完整渲染后的内容。
方案1:静态请求+精准定位(适合数据静态渲染的情况)
先试试用requests模拟浏览器请求,再通过表头文本精准锁定目标表格:
import requests from bs4 import BeautifulSoup # 目标URL quote_page = "http://pusatdata.kontan.co.id/reksadana/produk/469/Schroder-90-Plus-Equity-Fund" # 模拟浏览器请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 发送请求获取页面内容 response = requests.get(quote_page, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 遍历页面所有表格,通过表头文本找到目标表格 target_table = None for table in soup.find_all("table"): # 提取表格的表头单元格 header_cell = table.find("th") if header_cell and "TANGGAL/NAB/DIVIDEN/DAILY RETURN (%)" in header_cell.text.strip(): target_table = table break # 提取表格数据 if target_table: print("成功找到目标表格,数据如下:") rows = target_table.find_all("tr") for row in rows: # 提取每行的所有单元格内容 cells = row.find_all(["td", "th"]) row_content = [cell.get_text(strip=True) for cell in cells] print(row_content) else: print("未找到目标表格,可能是数据动态加载导致,请尝试方案2")
方案2:动态渲染爬取(适合数据JS加载的情况)
如果方案1找不到表格,说明数据是通过AJAX异步加载的,这时候需要用selenium模拟浏览器完整渲染页面:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup # 配置Chrome无头模式(不打开可视化窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") # 启动浏览器 driver = webdriver.Chrome(options=chrome_options) quote_page = "http://pusatdata.kontan.co.id/reksadana/produk/469/Schroder-90-Plus-Equity-Fund" driver.get(quote_page) # 等待页面加载完成(最多等10秒) driver.implicitly_wait(10) # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 同样通过表头文本定位目标表格 target_table = None for table in soup.find_all("table"): header_cell = table.find("th") if header_cell and "TANGGAL/NAB/DIVIDEN/DAILY RETURN (%)" in header_cell.text.strip(): target_table = table break # 提取并打印数据 if target_table: print("成功找到目标表格,数据如下:") rows = target_table.find_all("tr") for row in rows: cells = row.find_all(["td", "th"]) row_content = [cell.get_text(strip=True) for cell in cells] print(row_content) else: print("仍未找到目标表格,请检查页面结构是否有变化") # 关闭浏览器 driver.quit()
几个关键注意事项
- 一定要加
User-Agent请求头,否则很容易被网站识别为爬虫拦截; - 如果用静态请求拿不到数据,别犹豫直接上动态渲染方案;
- 定位元素时尽量用组合特征(比如表头文本+表格的class),不要依赖不稳定的ID或单一标签。
内容的提问来源于stack exchange,提问作者arctoris
相关产品推荐
相关产品推荐

