如何使用 BeautifulSoup 精准提取作者与单位信息(含缺失处理)
技术百科
心靈之曲
发布时间:2026-01-27
浏览: 次 本文详解 beautifulsoup 中基于 class 的元素遍历与文本提取技巧,重点解决因 dom 结构嵌套、兄弟节点关系复杂导致的 `none` 返回问题,并提供健壮的作者-单位配对方案,支持不等长数据与空 affiliation 的安全处理。
在网页爬虫实践中,仅用 soup.find_all("span") 全局搜索再逐个筛选子元素(如 tar.find("span", attrs={'name': True})),极易失败——根本原因在于:目标 和 并非父子嵌套关系,而是同级兄弟节点。因此第一段代码中 tar.find(...) 实际是在每个 内部递归查找,而作者名和单位标签彼此独立、平级并列,自然返回 None。
正确策略是:先精准定位父容器,再在其作用域内分别提取同类标签,最后通过 DOM 邻接关系(如 find_next_siblings)建立逻辑配对。以目标页面为例,所有作者信息均包裹在
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 写入时类型错误。
该方法兼具可读性、健壮性与扩展性,适用于各类学术页面、机构名录等存在“标题+副标题”或“姓名+职位/单位”平行结构的场景。
# ai
# 是在
# 爬虫
# 适用于
# 跳过
# 为例
# app
# 判断是否
# js
# 递归
# class
# html
# 作用域
# 根本原因
# php
# 遍历
# csv
# dom
# elif
# 极易
# 仅用
# beautifulsoup
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php怎么操作Redis_Redis扩展连接与基本
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Python邮件系统自动化教程_批量发送解析与模板
- 企业SEO优化选择网站建设模板的技巧
- Win11如何开启telnet服务 Win11启用
- Win11怎么关闭内容自适应亮度_Windows1
- Win11怎么激活Windows10_Win11激
- 如何在Golang中捕获结构体方法错误_Golan
- 如何在Golang中使用闭包_封装变量与函数作用域
- 如何更改Windows资源管理器的默认启动位置?(
- Win11怎么设置任务栏图标大小_Windows1
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win10怎样卸载iTunes_Win10卸载iT
- Windows10蓝屏SYSTEM_SERVICE
- Win11开机Logo怎么换_Win11自定义启动
- 如何在Golang中验证模块完整性_Golangg
- Win10如何卸载Skype_Win10卸载Sky
- Win11怎么设置任务栏对齐方式_Windows1
- Win11如何暂停系统更新 Win11暂停更新最长
- Win11怎么设置默认浏览器Chrome_Wind
- php报错怎么查看_定位PHP致命错误与警告的方法
- 如何使用Golang实现函数指针_函数变量与回调示
- php删除数据怎么清空表_truncate与del
- C++如何编写函数模板?(泛型编程入门)
- Python多进程教程_multiprocessi
- 如何处理“XML格式不正确”错误 常见XML we
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- Windows10无法识别USB设备描述符请求失败
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- php打包exe如何加密代码_防反编译保护方法【技
- Win11相机打不开提示错误怎么修_相机权限开启与
- Python 模块的 __name__ 属性如何由
- Python对象比较排序规则_集合使用说明【指导】
- 如何使用Golang实现跨域请求支持_Golang
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- 怎么将XML数据可视化 D3.js加载XML
- Win11资源管理器卡顿怎么办 Win11文件资源
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- Win11怎么开启专注模式_Windows11时钟
- c++怎么编写动态链接库dll_c++ __dec
- MAC怎么使用表情符号面板_MAC Emoji快捷
- Python对象比较与排序_集合使用说明【指导】
- 如何在 Go 中比较自定义的数组类型(如 [20]
- 如何在 Pandas 中按元素交集合并两列字符串
- Win11怎么查看电脑配置_Win11硬件配置详细
- Python爬虫项目实战教程_Scrapy抓取与存
- Win11怎么更改输入法顺序_Win11调整语言首
- 如何使用Golang搭建本地API测试环境_快速验
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘


QQ客服