Python爬取维基百科《海贼王》S20剧集表异常:仅获取首表数据
解决思路与修正代码
问题根源
你当前代码只爬取到第一个表格,是因为用了find('table')这类仅返回首个匹配元素的方法——而维基百科该页面的剧集列表是按篇章拆分成多个带wikitable sortable类的表格,必须批量获取所有符合条件的表格才能拿到完整数据。
具体解决步骤
- 获取所有目标表格:使用
find_all('table', class_='wikitable sortable')抓取页面内所有剧集表格 - 遍历表格提取数据:对每个表格,跳过表头行(含
<th>标签的行),逐行提取「总集数」(第一列)和「标题」(第三列) - 处理标题文本:标题列通常包含维基百科内部链接,需提取标签内的纯文本
- 统一写入CSV:将所有表格的提取结果汇总后写入CSV文件
修正后的代码示例
import requests from bs4 import BeautifulSoup import csv # 目标页面URL url = "https://en.wikipedia.org/wiki/One_Piece_(season_20)#Episode_list" # 发起请求并解析页面(可添加headers避免反爬) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 获取所有剧集表格 tables = soup.find_all('table', class_='wikitable sortable') # 准备CSV写入 with open('one_piece_season20_episodes.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) # 写入表头 writer.writerow(['No.Overall', 'Title']) # 遍历每个表格 for table in tables: # 遍历表格内的行,跳过表头(表头行含<th>) rows = table.find_all('tr') for row in rows[1:]: # 从第二行开始,跳过表头 cols = row.find_all('td') # 过滤空行或格式异常的行 if len(cols) >= 3: # 提取总集数(第一列) overall_num = cols[0].text.strip() # 提取标题(第三列,取纯文本) title = cols[2].text.strip() writer.writerow([overall_num, title]) print("数据已成功写入one_piece_season20_episodes.csv")
额外注意事项
- 部分表格可能存在合并单元格或篇章标题行,代码通过
len(cols)>=3过滤无效行 - 如果仍遇到反爬拦截,可延长请求间隔或使用代理IP优化请求策略
内容的提问来源于stack exchange,提问作者naoki
相关产品推荐
相关产品推荐

