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

如何提取HTML表格中<a>标签内的文本?网页爬取问题求助

《我的英雄学院》Wiki Quirk列表爬取问题修复方案

问题分析

代码报错及存在的问题:

  • 核心错误:代码用row.find_all('td')提取列,但目标表格的数据行使用<th>标签而非<td>,导致columns为空,无法满足len(columns)==4的判断条件。
  • 索引错误:原代码误将第二列(Usage图片列)当作用户列,实际用户列是第三列。
  • 类型列兼容问题:部分Quirk Type条目没有<a>标签(如报错中的Mutant),直接调用find('a')会返回None,引发后续报错。

修改方案

针对以上问题,对代码做如下调整:

  • 替换列提取逻辑:同时匹配<th>和<td>标签,确保能获取到所有列
  • 修正用户列索引:从columns[1]改为columns[2]
  • 兼容无链接的类型条目:先判断链接元素是否存在,不存在则直接提取列文本
  • 优化表格定位:使用更精确的类选择器锁定目标表格

修改后的完整代码

import requests
from bs4 import BeautifulSoup

url = 'https://myheroacademia.fandom.com/wiki/Quirk#List_of_Quirks'
response = requests.get(url)
html_content = response.content

soup = BeautifulSoup(html_content, 'html.parser')

# 更精确定位目标表格
quirks_table = soup.find('table', {'class': 'wikitable mw-collapsible'})

if quirks_table:
    format_string = '{:<40} | {:<60} | {:<30}'
    print(format_string.format('Quirk Name', 'Users', 'Type'))
    print('-' * 135)

    rows = quirks_table.find_all('tr')
    for row in rows[1:]:
        # 同时匹配th和td标签
        columns = row.find_all(['th', 'td'])
        if len(columns) == 4:
            # 提取Quirk名称
            quirk_elem = columns[0].find('a')
            quirk_name = quirk_elem.text.strip() if quirk_elem else columns[0].text.strip()

            # 提取用户名称(修正索引为2)
            user_elem = columns[2].find('a')
            user_name = user_elem.text.strip() if user_elem else columns[2].text.strip()

            # 提取Quirk类型,兼容无链接情况
            quirk_type_elem = columns[3].find('a')
            quirk_type = quirk_type_elem.text.strip() if quirk_type_elem else columns[3].text.strip()

            print(format_string.format(quirk_name, user_name, quirk_type))
        else:
            print('无法找到完整列的行:', row)
else:
    print('未找到Quirks表格')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:54:59