使用BeautifulSoup爬取afltables.com表格失败问题求助
问题:爬取AFL比赛记录页面表格失败的排查与解决
我刚接触Python,想要爬取https://afltables.com/的网页数据。进入阿德莱德队的比赛记录页面后,页面显示20个对应不同对手的比赛记录表格,例如第一个对阵布里斯班的表格id为sortableTable0,但我通过id或class='sortable'引用表格时,代码无法获取到表格;循环检测到页面存在sortable表格,但也无法正常处理。请问这是代码问题还是网站问题?我的最终目标是逐行解析所有俱乐部的比赛记录。
附上原代码:
import requests import pandas as pd from bs4 import BeautifulSoup df = pd.DataFrame(columns=['test1', 'test2']) URL = "https://afltables.com/afl/teams/adelaide/allgames_tm.html" print(URL) page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser") #print(soup.prettify()) table = soup.find('table',id='sortableTable2') #table = soup.find('table', class_ = 'sortable') rows = table.find_all('tr') for row in rows: columns = row.find_all('td') test1 = columns[0].text.strip() test2 = columns[1].text.strip() df = df.append({'test1': test1, 'test2': test2}, ignore_index=True) df.head
排查与解决方法
问题根源
这是代码问题,网站的表格结构完全正常可爬取,问题出在这几点:
- 表格的
class属性是sortable stats多值组合,直接用class_='sortable'精确匹配会失败 - 若指定的表格
id不存在或网络请求返回内容异常,table会是None,后续调用find_all('tr')直接报错 - 代码没区分表头行(
<tr>内是<th>而非<td>),循环时会因columns为空触发索引错误 df.append已被pandas弃用,且循环追加效率极低
修正后的代码
以下是可批量爬取所有比赛表格、逐行解析记录的代码:
import requests import pandas as pd from bs4 import BeautifulSoup URL = "https://afltables.com/afl/teams/adelaide/allgames_tm.html" page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser") # 用CSS选择器匹配所有带sortable类的表格,兼容多class场景 tables = soup.select('table.sortable') # 用列表存储数据,比循环append高效数倍 data_list = [] for table in tables: rows = table.find_all('tr') for row in rows: # 只处理包含<td>的数据行,跳过<th>组成的表头 td_cols = row.find_all('td') if td_cols: # 提取当前行所有单元格文本 row_texts = [col.text.strip() for col in td_cols] # 确保至少有2列数据再存入,避免索引越界 if len(row_texts) >= 2: data_list.append({ 'test1': row_texts[0], 'test2': row_texts[1] }) # 转换为DataFrame并查看结果 df = pd.DataFrame(data_list) print(df.head())
关键优化点
- 使用
select('table.sortable')精准匹配所有目标表格,不受多class属性影响 - 增加数据行判断,跳过表头避免报错
- 改用列表暂存数据再转DataFrame,大幅提升运行效率
- 加入长度校验,防止异常行导致的索引错误
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

