如何使用 BeautifulSoup 精准提取作者与单位信息(含缺失处理)
发布时间 - 2026-01-27 00:00:00 点击率:次本文详解 beautifulsoup 中基于 class 的元素遍历与文本提取技巧,重点解决因 dom 结构嵌套、兄弟节点关系复杂导致的 `none` 返回问题,并提供健壮的作者-单位配对方案,支持不等长数据与空 affiliation 的安全处理。
在网页爬虫实践中,仅用 soup.find_all("span") 全局搜索再逐个筛选子元素(如 tar.find("span", attrs={'name': True})),极易失败——根本原因在于:目标 和 并非父子嵌套关系,而是同级兄弟节点。因此第一段代码中 tar.find(...) 实际是在每个 内部递归查找,而作者名和单位标签彼此独立、平级并列,自然返回 None。
正确策略是:先精准定位父容器,再在其作 
from bs4 import BeautifulSoup, SoupStrainer
import requests
# 仅解析目标 section,跳过无关 HTML,提升性能与鲁棒性
strainer = SoupStrainer(name='section', class_='item authors')
def extract_authors_with_affiliations(url: str) -> list[tuple[str, str | None]]:
response = requests.get(url)
response.raise_for_status()
# 使用 strainer 限制解析范围
soup = BeautifulSoup(response.text, 'lxml', parse_only=strainer)
name_spans = soup.find_all('span', class_='name')
results = []
for name_tag in name_spans:
name = name_tag.get_text(strip=True)
# 向后查找最近的 sibling span,判断是否为 affiliation
affiliation = None
for sibling in name_tag.find_next_siblings('span'):
classes = sibling.get('class', [])
if 'affiliation' in classes:
affiliation = sibling.get_text(strip=True)
break
elif 'name' in classes: # 遇到下一个作者,说明当前作者无 affiliation
break
results.append((name, affiliation))
return results
# 使用示例
data = extract_authors_with_affiliations("https://rpmgf.pt/ojs/index.php/rpmgf/article/view/13494")
for name, aff in data:
print(f"{name} → {aff or '[未提供单位]'}")✅ 关键要点总结:
- ❌ 避免全局 find_all("span") + 深层 find():易因结构误判返回 None;
- ✅ 优先用 SoupStrainer 锁定语义区块(如 section.item.authors),缩小搜索空间;
- ✅ 利用 find_next_siblings() 按 DOM 顺序匹配邻近 affiliation,天然处理“部分作者无单位”的不规则情况;
- ✅ 使用 .get_text(strip=True) 替代 .text,自动清理换行符与多余空格;
- ✅ 对 affiliation 使用 or '[未提供单位]' 或显式 None 判断,避免 CSV 写入时类型错误。
该方法兼具可读性、健壮性与扩展性,适用于各类学术页面、机构名录等存在“标题+副标题”或“姓名+职位/单位”平行结构的场景。
# php
# html
# js
# app
# csv
# ai
# 爬虫
# 作用域
# elif
# beautifulsoup
# 递归
# class
# dom
# 是在
# 遍历
# 适用于
# 为例
# 极易
# 跳过
# 仅用
# 根本原因
# 判断是否
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel怎么为数据库表字段添加索引以优化查询
制作旅游网站html,怎样注册旅游网站?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
如何在新浪SAE免费搭建个人博客?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何用PHP快速搭建高效网站?分步指南
Laravel如何配置和使用缓存?(Redis代码示例)
Laravel如何发送系统通知?(Notification渠道示例)
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel怎么使用Intervention Image库处理图片上传和缩放
独立制作一个网站多少钱,建立网站需要花多少钱?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何用虚拟主机快速搭建网站?详细步骤解析
图册素材网站设计制作软件,图册的导出方式有几种?
iOS验证手机号的正则表达式
java ZXing生成二维码及条码实例分享
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Android仿QQ列表左滑删除操作
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
,在苏州找工作,上哪个网站比较好?
jQuery中的100个技巧汇总
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Laravel distinct去重查询_Laravel Eloquent去重方法
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel如何使用模型观察者?(Observer代码示例)
韩国服务器如何优化跨境访问实现高效连接?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
北京企业网站设计制作公司,北京铁路集团官方网站?
如何在云主机上快速搭建多站点网站?
如何快速搭建高效可靠的建站解决方案?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何在 React 中条件性地遍历数组并渲染元素
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
简历没回改:利用AI润色让你的文字更专业
公司门户网站制作流程,华为官网怎么做?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
详解Android——蓝牙技术 带你实现终端间数据传输
php json中文编码为null的解决办法
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Laravel如何使用Telescope进行调试?(安装和使用教程)
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何选择可靠的免备案建站服务器?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解

