You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用BeautifulSoup爬取网页表格定位失败报错排查

问题根因
  • 你使用的sc-lhVmIH fYUufF sc-cmTdod gUHuZc是CSS Modules编译生成的动态类名,会随站点发版、资源重构建随机变化,完全不能作为稳定的元素定位依据,这也是soup.find匹配不到table元素、后续执行find_all('tr')触发空对象报错的直接原因。
  • 目标站点是React单页应用,你最开始写的requests.get(url)只能拿到初始空壳HTML,所有表格数据都是前端完成鉴权、加载JS资源后异步拉取接口渲染的;就算你实现了自动登录流程,如果没有等表格DOM完全渲染就提取页面源码,一样会拿到空内容。
修复方案

1. 替换元素定位逻辑,彻底弃用动态类名

不要用任何sc-开头的类名做定位锚点,改用文本特征定位,稳定性不受前端样式改动影响:

  • 以表格表头的Balance文本为锚点,先定位到对应<th>标签,再向上回溯拿到父级<table>元素。
  • 如果你用Selenium实现自动登录流程,页面跳转后的等待&定位逻辑参考如下:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 完成登录、跳转到目标页面后执行
wait = WebDriverWait(driver, 15)
# 强制等Balance表头出现,确认表格开始渲染
balance_th = wait.until(EC.presence_of_element_located(
    (By.XPATH, "//th[normalize-space(text())='Balance']")
))
# 沿DOM树向上查找,拿到所属的table节点
table_el = balance_th.find_element(By.XPATH, "./ancestor::table")

2. 确保页面渲染完成后再提取源码

不要跳转页面后立刻取page_source,等表头加载完成后,再额外等表格内的<td>数据行渲染完毕,避免接口数据还没返回就提前抓源码。

3. 优化BeautifulSoup解析逻辑

拿到完整页面源码后,同样用文本锚点定位table,不依赖动态class,参考代码:

from bs4 import BeautifulSoup
import pandas as pd

html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
# 定位table
table = soup.find("th", string="Balance").find_parent("table")

rows = table.find_all("tr")
data = []
# 跳过第一行表头
for row in rows[1:]:
    cols = [ele.text.strip() for ele in row.find_all("td")]
    # 校验列数,过滤空行、加载中行
    if len(cols) == 6:
        data.append(cols)

result = pd.DataFrame(
    data,
    columns=['Balance','Addresses','% Addresses (Total)','Coins','USD','% Coins (Total)']
)
print(result)
避坑提示
  • 如果是用requests手动携带Cookie模拟登录,必须保证请求头的User-Agent、Referer和真实浏览器完全一致,否则接口会拦截请求,返回的HTML里不会包含业务数据。
  • 所有前端构建生成的随机类名(通常是短hash、sc-/css-前缀的无意义类名)都不要作为定位依据,这类类名随时可能变化。

内容的提问来源于stack exchange,提问作者DBT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:03:14