如何移除网页爬取教授名单中的HTML标签并适配后续循环
解决教授姓名提取与后续爬取优化问题
你的代码存在几个关键问题,导致无法正确提取纯姓名,也没法高效处理后续的个人页面爬取,下面是修正后的代码和详细说明:
修正后的代码
import requests from bs4 import BeautifulSoup from pprint import pprint url = 'https://www.bu.edu/com/profiles/faculty/page/1/' response = requests.get(url) response.raise_for_status() # 自动抛出请求失败的异常,方便排查问题 my_data = [] soup = BeautifulSoup(response.text, 'html.parser') # 遍历每个教授的卡片容器,确保每次循环只处理单个教授的信息 for prof_card in soup.select('div.profile-card'): # 提取纯姓名:用select_one获取单个h4标签,get_text提取文本并清理空白 name = prof_card.select_one('h4.profile-card__name').get_text(strip=True) # 获取个人页面链接,方便后续爬取邮箱 prof_link = prof_card.select_one('a').get('href') # 补全相对路径为完整URL if not prof_link.startswith('http'): prof_link = f'https://www.bu.edu{prof_link}' my_data.append({ "name": name, "profile_url": prof_link }) pprint(my_data)
关键改进点
- 修复循环逻辑:原代码
for professor in html是遍历整个页面的所有子节点,完全不符合需求。改为遍历每个教授的卡片容器(div.profile-card),确保每次循环处理单个教授的信息。 - 提取纯文本:用
get_text(strip=True)替代直接存储Tag对象,自动去除标签包裹的HTML结构,同时清理文本前后的空格、换行符。 - 获取个人页面链接:同时提取每个教授的个人页面URL,存入数据列表,为后续爬取邮箱做好准备。
- 异常处理:添加
response.raise_for_status(),如果请求失败会直接抛出异常,避免后续处理无效的HTML内容。
后续爬取邮箱的思路
有了个人页面链接后,可以直接循环访问每个链接,提取邮箱地址:
for prof in my_data: try: prof_response = requests.get(prof['profile_url']) prof_response.raise_for_status() prof_soup = BeautifulSoup(prof_response.text, 'html.parser') # 匹配mailto开头的链接,提取邮箱 email_tag = prof_soup.select_one('a[href^="mailto:"]') if email_tag: prof['email'] = email_tag.get('href').replace('mailto:', '') except Exception as e: print(f"爬取{prof['name']}的邮箱失败: {str(e)}") pprint(my_data)
内容的提问来源于stack exchange,提问作者Gregory Durgin
相关产品推荐
相关产品推荐

