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

如何用Python和BeautifulSoup提取div下h3内a标签的href属性

解决哈佛免费课程页面的课程链接提取问题

先给你一套可直接运行的完整代码,针对你提到的页面结构提取课程名和链接:

import requests
from bs4 import BeautifulSoup

# 模拟浏览器请求头,避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

# 请求目标页面
url = "https://pll.harvard.edu/catalog/free"
response = requests.get(url, headers=headers)
response.raise_for_status()  # 请求失败直接抛出错误,方便排查

# 解析HTML内容
soup = BeautifulSoup(response.text, "html.parser")

# 定位所有class为field__item的h3标签(对应每个课程的标题容器)
course_h3_list = soup.find_all("h3", class_="field__item")

# 遍历容器提取信息
for h3 in course_h3_list:
    # 找到h3下的a标签
    course_link_tag = h3.find("a")
    # 加判断避免None报错(防止页面结构异常的情况)
    if course_link_tag:
        course_name = course_link_tag.get_text(strip=True)
        # 提取你需要的href路径
        course_path = course_link_tag["href"]
        print(f"课程名称:{course_name}")
        print(f"课程路径:{course_path}\n")

关键细节说明

  1. 解决报错的核心

    • 你之前出现None无find属性错误,是因为直接对find返回的None调用属性/方法。比如某个h3里没有a标签时,h3.find("a")会返回None,必须加if course_link_tag:的判断再后续操作。
    • 注意BeautifulSoup中查找class要用class_参数(class是Python关键字,不能直接用),这是新手常踩的坑。
  2. 提取href的正确姿势

    • 找到a标签后,直接用标签["href"]就能拿到属性值;也可以用标签.get("href"),后者更安全(属性不存在时返回None而非报错)。
  3. 请求头的作用

    • 直接用requests.get可能被网站拦截,加User-Agent模拟浏览器请求,确保能拿到完整的页面内容,这也是很多新手爬取失败的隐形原因。

排查小技巧

如果还是拿不到数据,先打印soup.prettify()查看返回的HTML结构是否和你预期一致,确认选择器是否匹配实际页面结构。比如若页面更新后,field__item是h3的父div类,就把代码调整为soup.find_all("div", class_="field__item")再找里面的h3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:57:21