使用BeautifulSoup获取元素title属性报KeyError的解决方法
报错根源
你触发KeyError: 'title'的核心问题是找错了属性所属的标签层级:
当前代码逻辑是直接从<li>列表项标签上读取title属性,但实际维基百科对应页面的DOM结构里,<li>只是纯文本的列表容器,本身压根没有挂载title属性——真正带title值的,是<li>内部嵌套的、指向各编程语言词条的<a>超链接标签。
之前参考的同类方案不生效,本质是参考案例的网页结构是li标签直接带title,和当前维基页面的结构完全不匹配,直接硬套自然会报错。
可落地的修正方案
核心改动两个方向:
- 不要直接对
li标签做属性读取,先定位到li内部嵌套的<a>标签,再从超链接上取属性 - 读取属性的时候不用方括号直接索引,换成
get()方法做容错,避免碰到无对应属性的标签直接抛错中断程序
修正后的完整代码参考:
import requests from bs4 import BeautifulSoup # 加浏览器请求头,避免被维基百科反爬拦截返回403 request_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/125.0.0.0 Safari/537.36" } res = requests.get('https://en.wikipedia.org/wiki/List_of_programming_languages', headers=request_headers) # 校验请求状态,确保拿到的是正常网页内容 res.raise_for_status() soup = BeautifulSoup(res.text, 'lxml') for col_container in soup.find_all('div', {'class': 'div-col'}): for list_item in col_container.find_all('li'): # 定位每个列表项里的超链接 link = list_item.find('a') # 没有超链接的异常结构直接跳过 if not link: continue # 用get取title,没有title就用超链接的文本内容兜底 lang_name = link.get('title') or link.get_text(strip=True) print(lang_name)
实操避坑提醒
- 稳定性优先:不要用
标签["属性名"]的硬索引写法,只要碰到一个不存在对应属性的标签,整个循环就会因为KeyError中断,用标签.get("属性名")碰到不存在的属性只会返回None,稳定性高很多 - 反爬适配:爬虫请求的时候一定要带
User-Agent标识,维基百科对无标识的脚本请求拦截率很高,很多人代码逻辑写对了但拿不到正常内容,全是漏了请求头的问题
内容的提问来源于stack exchange,提问作者Voxxxx
相关产品推荐
相关产品推荐

