使用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
相关产品推荐
相关产品推荐

