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

使用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 

排查与解决方法

问题根源

这是代码问题,网站的表格结构完全正常可爬取,问题出在这几点:

  1. 表格的class属性是sortable stats多值组合,直接用class_='sortable'精确匹配会失败
  2. 若指定的表格id不存在或网络请求返回内容异常,table会是None,后续调用find_all('tr')直接报错
  3. 代码没区分表头行(<tr>内是<th>而非<td>),循环时会因columns为空触发索引错误
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:44:52