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

使用BeautifulSoup抓取钱币目录表格数据至Dataframe遇异常

解决钱币目录网站表格数据抓取与DataFrame保存问题

我来帮你搞定这个抓取数据的问题,你现在遇到的核心问题有两个:一是没把所有行数据收集起来(每次循环只生成单条row却没存到集合里,最后只剩最后一行),二是抓取结果里混了无效的JS代码和乱码,需要清理。下面是修复后的完整方案:

问题拆解

  • 原代码没有用列表存储每一行数据,每次循环的row会被覆盖,最终只保留最后一次循环的结果
  • 部分行包含JavaScript脚本片段(比如$('subGraph55337').on(...))、空行和乱码字符,需要过滤和清洗

修复后的完整代码

import bs4 as bs
import urllib.request
import pandas as pd

# 抓取目标页面内容
source = urllib.request.urlopen('http://www.gcoins.net/en/catalog/view/45518').read()
soup = bs.BeautifulSoup(source, 'lxml')

# 定位到目标表格
table = soup.find('table', attrs={"class":"subs noBorders evenRows"})
table_rows = table.find_all('tr')

# 初始化空列表,用来存储所有有效行数据
data_rows = []

for tr in table_rows:
    td = tr.find_all('td')
    # 提取单元格文本,并自动清理多余的空格、换行符
    row = [cell.get_text(strip=True) for cell in td]
    
    # 过滤空行和包含JS代码的无效行(通过判断是否有JS关键字)
    if row and not any('$(' in cell or '.on(' in cell for cell in row):
        # 清理乱码字符(比如抓取到的「鈥�」)
        cleaned_row = [cell.replace('鈥�', '') if '鈥�' in cell else cell for cell in row]
        data_rows.append(cleaned_row)

# 转换为DataFrame,设置对应列名(匹配原表格的实际内容)
df = pd.DataFrame(data_rows, columns=['标记', '', '年份', '', '发行量', '品相', '价格'])

# 删除无用的空列
df = df.drop('', axis=1)

# 导出到Excel文件,去掉索引列
df.to_excel('钱币收藏数据.xlsx', index=False)

# 打印验证结果
print(df)

关键修复说明

  • 收集全量数据:用data_rows列表存储每一行有效数据,避免循环中的数据覆盖
  • 清洗文本内容:用get_text(strip=True)自动去除单元格的多余空格和换行;过滤掉带JS代码的无效行
  • 处理乱码:替换抓取到的乱码字符,保证数据可读性
  • 优化DataFrame结构:删除无用空列,设置清晰列名,导出时去掉默认索引列

运行这段代码后,你就能得到干净完整的表格数据,并且成功导出到Excel文件里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:32