Python爬取足球网站<a>标签href属性遇空值及报错问题求助
问题分析与修正
核心错误点
- 变量名不匹配:读取页面内容存入
page变量,但初始化BeautifulSoup时误用了未定义的html变量,导致解析无效内容,后续所有操作都基于错误的解析结果。 - ResultSet操作错误:
find_all()返回的是ResultSet(类列表集合),不能直接调用.get()方法,必须遍历集合中的单个Tag元素再操作。 - 属性存在性判断错误:用
'href' in link判断属性是否存在是错误的——这是检查字符串href是否在Tag的文本内容里,而非判断标签是否有href属性,会过滤掉所有有效标签,导致列表为空。 - 索引访问的前提错误:用
link['href']索引访问时,若标签本身无href属性会直接报错,需先确保标签包含该属性,或用.get('href')方法(不存在时返回None,避免报错)。
修正后的代码
第一步:正确解析页面
from bs4 import BeautifulSoup with open("premier_league/page_2.html", encoding='utf-8') as f: page = f.read() parsed_page = BeautifulSoup(page, "html.parser") # 修正变量名,使用读取到的page内容
第二步:正确提取href属性
方式1:兼容所有标签(自动过滤无href的标签)
href_list = [link.get('href') for link in parsed_page.find_all("a") if link.get('href')]
- 用
.get('href')替代直接索引,避免无属性时报错; - 用
if link.get('href')过滤掉返回None的无效项。
方式2:直接筛选带href属性的标签
href_list = [link['href'] for link in parsed_page.find_all("a", href=True)]
方式3:筛选特定关键词的链接
如果需要提取包含特定内容的链接(比如赛事相关链接),可添加过滤条件:
target_hrefs = [link['href'] for link in parsed_page.find_all("a", href=True) if 'match' in link['href']]
对应问题的修正说明
- 问题1:遍历ResultSet中的每个Tag,对单个Tag调用
.get('href'),而非直接对ResultSet集合调用。 - 问题2:修正解析错误后,
find_all("a")返回的都是标签对象,而非字符串,即可正常用['href']索引。 - 问题3:去掉错误的
if 'href' in link判断,或替换为if link.has_attr('href'),即可得到有效列表。 - 问题4:修正解析错误后,再添加特定关键词的过滤条件,即可正确筛选目标链接。
内容的提问来源于stack exchange,提问作者KIZ-MAN
相关产品推荐
相关产品推荐

