如何提取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
相关产品推荐
相关产品推荐

