如何用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")
关键细节说明
解决报错的核心
- 你之前出现
None无find属性错误,是因为直接对find返回的None调用属性/方法。比如某个h3里没有a标签时,h3.find("a")会返回None,必须加if course_link_tag:的判断再后续操作。 - 注意BeautifulSoup中查找class要用
class_参数(class是Python关键字,不能直接用),这是新手常踩的坑。
- 你之前出现
提取href的正确姿势
- 找到a标签后,直接用
标签["href"]就能拿到属性值;也可以用标签.get("href"),后者更安全(属性不存在时返回None而非报错)。
- 找到a标签后,直接用
请求头的作用
- 直接用
requests.get可能被网站拦截,加User-Agent模拟浏览器请求,确保能拿到完整的页面内容,这也是很多新手爬取失败的隐形原因。
- 直接用
排查小技巧
如果还是拿不到数据,先打印soup.prettify()查看返回的HTML结构是否和你预期一致,确认选择器是否匹配实际页面结构。比如若页面更新后,field__item是h3的父div类,就把代码调整为soup.find_all("div", class_="field__item")再找里面的h3。
内容的提问来源于stack exchange,提问作者user22266165
相关产品推荐
相关产品推荐

