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

Python/Selenium/Beautiful Soup爬取时出现KeyError 'href'问题求助

问题分析与解决方案

核心原因:并非加载问题,而是存在无href属性的<a>标签

你遇到的KeyError: 'href'不是页面未加载完整导致的,而是页面中存在没有href属性的<a>元素。现代网页里不少<a>标签仅用于前端交互(比如折叠面板、按钮触发逻辑),这类标签本身就没有href属性,直接通过link['href']访问必然会报错。

验证方式

你可以在循环里加个判断,打印出所有无href的<a>标签,确认情况:

for link in links:
    if 'href' not in link.attrs:
        print("无href的a标签:", link)
    else:
        print(link['href'])

解决方案

1. 安全获取href属性

用get()方法替代直接索引,属性不存在时会返回None,避免报错:

for link in links:
    href = link.get('href')
    if href:  # 过滤掉None或空字符串的无效链接
        print(href)

2. 精准定位目标链接

如果你的目标是爬取bug bounty项目链接,没必要遍历所有<a>标签。可以通过标签的类名或父元素精准筛选,比如HackerOne的项目链接都在特定卡片内:

# 只获取项目卡片中的有效链接
project_links = soup.find_all("a", class_="program-name")
for link in project_links:
    print(link['href'])

3. 优化滚动加载逻辑(针对动态页面)

如果页面是滚动加载更多内容,单次滚动+固定sleep的稳定性较差,建议用显式等待结合多次滚动:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get(url)

last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待新内容加载完成
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script("return document.body.scrollHeight") > last_height
    )
    last_height = driver.execute_script("return document.body.scrollHeight")
    # 可添加终止条件,比如滚动次数或判断是否加载完毕
    if last_height > 100000:  # 示例:超过特定高度停止滚动
        break

soup = BeautifulSoup(driver.page_source,'html.parser')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33