循环混入其他元素时出现Href键错误问题排查
Fixing the 'href' KeyError When Scraping ResearchGate Links in a Loop
我太懂这种挫败感了——单独跑代码一切正常,一整合到复杂循环里就突然抛出KeyError: 'href'。咱们来一步步拆解问题,搞定它:
为什么会出现这个问题?
单独测试时,你抓取的页面里所有匹配class的<a>标签都恰好带有href属性,但放到循环里后,可能遇到了这些情况:
- 某些目标页面的结构和测试页不同,存在匹配class但没有href的标签
- 循环中请求的页面加载不完整(比如网络波动、反爬机制导致返回异常内容)
- 页面动态加载的内容没被正确抓取(不过你的代码是直接取静态HTML,这个可能性稍低)
解决方案
1. 先检查href属性是否存在再访问
最直接的办法是在循环里增加判断,确保标签确实有href属性再取值:
for a in soup.find_all('a', {"class": "nova-e-badge nova-e-badge--color-green nova-e-badge--display-block nova-e-badge--luminosity-high nova-e-badge--size-l nova-e-badge--theme-solid nova-e-badge--radius-m nova-v-publication-item__type"}): # 先判断href是否在标签的属性列表里 if 'href' in a.attrs: print(a['href']) else: # 可选:打印异常标签,方便排查问题页面 print(f"Warning: Found a matching tag without href: {a}")
2. 用CSS选择器直接过滤带href的标签
更高效的方式是从根源上只获取带有href属性的目标标签,使用CSS选择器的[href]规则:
# 把class选择器和[href]结合,只返回有链接的标签 target_selector = 'a.nova-e-badge.nova-e-badge--color-green.nova-e-badge--display-block.nova-e-badge--luminosity-high.nova-e-badge--size-l.nova-e-badge--theme-solid.nova-e-badge--radius-m.nova-v-publication-item__type[href]' for a in soup.select(target_selector): print(a['href'])
这样select()方法只会返回同时满足class匹配且带有href属性的<a>标签,彻底避免KeyError。
3. 给循环加上异常处理(避免整体崩溃)
如果你的循环是遍历多个URL,建议加上异常捕获,防止单个页面的问题导致整个循环终止:
import time import requests from bs4 import BeautifulSoup as bsoup url_list = ["https://www.researchgate.net/profile/David_Severson", ...] # 你的URL列表 for url in url_list: try: # 加延迟避免反爬,也提升请求稳定性 time.sleep(2) r = requests.get(url) r.raise_for_status() # 捕获HTTP请求错误(比如403、500) soup = bsoup(r.text, "lxml") target_selector = 'a.nova-e-badge.nova-e-badge--color-green.nova-e-badge--display-block.nova-e-badge--luminosity-high.nova-e-badge--size-l.nova-e-badge--theme-solid.nova-e-badge--radius-m.nova-v-publication-item__type[href]' for a in soup.select(target_selector): print(a['href']) except Exception as e: print(f"Failed to process {url}: {str(e)}") continue
额外提一句:ResearchGate有反爬机制,循环请求时一定要加合理的延迟,不然很容易被封禁IP,也可能导致页面返回异常内容,间接引发这类错误。
内容的提问来源于stack exchange,提问作者Query777
相关产品推荐
相关产品推荐

