
本文介绍如何通过 beautifulsoup 遍历 html 元素,准确获取每个标签内的纯文本内容及其原始标签名(如 `p`、`h1`),并避免常见解析陷阱。
在使用 BeautifulSoup 解析 HTML 片段时,一个常见需求是:同时提取每段文本及其所属的 HTML 标签名称(如 对应 'p', 对应 'h1')
。初学者常误用 tag.tag 或尝试遍历 soup 根对象的直接子节点,结果因混入 NavigableString(如空白符、换行)而报错——NavigableString 对象没有 tag 属性,也无 name。
正确做法是:使用 soup.find_all() 获取所有标签元素(不包括文本节点),再通过 .text 获取渲染后纯文本,用 .name 属性获取标签名。注意:.name 是 BeautifulSoup 中表示标签名称的标准属性(例如
以下为完整示例代码:
from bs4 import BeautifulSoup html = '''Some text
立即学习“前端免费学习笔记(深入)”;
Some text
More content''' soup = BeautifulSoup(html, 'html.parser') # 推荐显式指定解析器 for tag in soup.find_all(): print(f"'{tag.text}' → <{tag.name}>")
输出结果:
'Some text' →'Some text' →
'More content' →
✅ 关键注意事项:
- 始终显式传入解析器(如 'html.parser'),避免依赖默认解析器(如 lxml)导致结构被自动补全(例如包裹成 ...),干扰原始标签层级;
- find_all() 默认返回所有嵌套标签(含子标签),若只需顶层标签,可加参数 recursive=False;
- 若需排除空标签或过滤特定标签,可结合 find_all('p', 'h1', 'span') 或使用 CSS 选择器(如 soup.select('p, h1'));
- .text 返回的是已合并的可见文本(自动忽略注释、脚本内容等),如需保留原始 HTML 内容,改用 .get_text() 并配置分隔符,或直接访问 .string(仅当标签内仅有单一字符串时有效)。
掌握 tag.name 与 tag.text 的组合使用,即可稳健实现“文本–标签”映射,为后续内容分析、结构化抽取或模板渲染打下基础。











