当前位置: 代码网 > it编程>前端脚本>Python > Python去除HTML标签获取纯文本的四种方法

Python去除HTML标签获取纯文本的四种方法

2026年05月14日 Python 我要评论
本文介绍了四种从html提取纯文本的方法:使用beautifulsoup(推荐),简单易用且容错强正则表达式适合简单场景,速度快但可能出错html.parser是标准库方案,无需安装但代码较多lxml

本文介绍了四种从html提取纯文本的方法:

  • 使用beautifulsoup(推荐),简单易用且容错强
  • 正则表达式适合简单场景,速度快但可能出错
  • html.parser是标准库方案,无需安装但代码较多
  • lxml性能最佳但需安装c库

具体实现方法如下:

方法1:使用 beautifulsoup(推荐)

from bs4 import beautifulsoup

html = "<p>hello <b>world</b>! <a href='#'>click</a></p>"
soup = beautifulsoup(html, 'html.parser')
text = soup.get_text()
print(text)  # hello world! click

方法2:使用正则表达式(简单场景)

import re

html = "<p>hello <b>world</b>! <a href='#'>click</a></p>"
text = re.sub(r'<[^>]+>', '', html)
print(text)  # hello world! click

方法3:使用 html.parser(标准库)

from html.parser import htmlparser

class myhtmlparser(htmlparser):
    def __init__(self):
        super().__init__()
        self.text = []
    
    def handle_data(self, data):
        self.text.append(data)
    
    def get_text(self):
        return ''.join(self.text)

html = "<p>hello <b>world</b>!</p>"
parser = myhtmlparser()
parser.feed(html)
print(parser.get_text())  # hello world!

方法4:使用 lxml(性能最好)

from lxml import html

html_str = "<p>hello <b>world</b>!</p>"
tree = html.fromstring(html_str)
text = tree.text_content()
print(text)  # hello world!

方法对比

方法优点缺点
beautifulsoup简单易用,容错强需要安装第三方库
正则无需安装,速度快复杂html可能出错
html.parser标准库,无需安装代码稍多
lxml速度最快,功能强大需要安装c库

推荐:一般用 beautifulsoup,简单场景用正则

pip install beautifulsoup4 lxml

知识扩展

在 python 中从 html 提取纯文本,确实有不同的思路和工具。简单来说,首选是用 beautifulsoup 搭配 lxml 解析器——它在功能全面性、开发效率和性能之间取得了最佳平衡,足以覆盖 99% 的应用场景。

这里总结了几种主流方法,你可以先快速了解它们的核心优劣:

方法核心理念优点缺点适用场景
beautifulsoup将html解析为树结构,遍历提取文本节点api简单易用,容错性强,能优雅处理不规范html纯python实现,处理超大型文件时性能相对较弱绝大多数应用,尤其是网页内容多样、结构不确定的场景
lxml基于c语言的高性能库,直接操作dom树性能极高,内存占用低api相对底层,语法不如beautifulsoup直观追求极致性能,如大规模、高频次的爬虫任务
html2text将html转为markdown格式,兼顾纯文本能较好地保留markdown的段落、链接等语义结构重点是将html转为markdown,而非最原始的纯文本需要保留一定文本结构(如层级列表)的应用
正则表达式 (regex)基于规则的模式匹配,直接操作字符流速度最快,尤其在处理简单片段时无法理解html结构,易出错,难以处理嵌套和复杂情况仅限一次性、结构极其固定的简单脚本,绝不应用于生产环境

通用首选:beautifulsoup

这是最推荐新手和绝大多数应用场景的首选方法。它的核心思想是将html解析成一棵“标签树”,然后提供像 find()find_all() 等非常直观的方法来遍历和提取内容。

from bs4 import beautifulsoup
html_content = """
<div class="article">
    <h1>这是标题</h1>
    <p>这是正文内容,包含 <strong>加粗文字</strong>。</p>
    <a href="https://example.com" rel="external nofollow" >这是一个链接</a>
</div>
"""
# 使用 lxml 作为解析器以获得更佳性能
soup = beautifulsoup(html_content, 'lxml')
# 核心方法:.get_text() 提取所有文本,strip=true 用于去除首尾空白
text = soup.get_text(strip=true)
print(text)
# 输出:这是标题这是正文内容,包含加粗文字。这是一个链接
  • get_text() 方法:这是最核心的方法,它会递归地遍历整个解析树,将所有文本内容拼接成一个字符串。strip=true 参数可以删除文本片段首尾的多余空白。
  • 灵活定位:如果只想提取特定部分的文本,可以先用 find() 等方法精确定位元素,再调用 get_text()
# 只提取 &lt;div&gt; 标签内的内容
div_tag = soup.find('div', class_='article')
content = div_tag.get_text(strip=true)

追求性能:lxml

如果你的任务是海量、高频的网页解析,性能是关键考量,那么 lxml 是你的不二之选。

  • 性能优势:其底层由c语言实现,在处理大型html文档时比纯python的 beautifulsoup 快得多。
  • xpath支持lxml 的强大之处在于对 xpath 的完整支持。xpath是一种专门用于在xml/html文档中查找信息的路径语言,可以非常精准地定位到任何节点。
from lxml import html
html_content = """
<div class="product">
    <h2>产品名称</h2>
    <p class="price">价格:$99.99</p>
    <p>产品描述...</p>
</div>
"""
tree = html.fromstring(html_content)
# 使用 xpath 定位并提取文本
# 'text()' 是获取元素自身文本的xpath函数
title = tree.xpath('//div[@class="product"]/h2/text()')[0]
price_text = tree.xpath('//p[@class="price"]/text()')[0]
print(title)        # 输出:产品名称
print(price_text)   # 输出:价格:$99.99

强强联合:你完全可以将 lxml 用作 beautifulsoup 的解析器,从而实现“beautifulsoup的易用性”加上“lxml的高性能”。

soup = beautifulsoup(html_content, 'lxml')

快速上手其他方案

正则表达式 (regex)

正则表达式适用于无需安装任何第三方库、且html结构极其简单的快速脚本场景。

import re
html_content = '<div>文本内容</div><span>更多文本</span>'
# re.sub将匹配到的所有标签替换为空字符串
pure_text = re.sub(r'<[^>]+>', '', html_content)
print(pure_text) # 输出:文本内容更多文本

警告:在复杂的真实网页中,html可能出现未闭合、自闭合或复杂的嵌套标签,此时正则表达式极易失效或出错。

html2text

这是一个能保留文本结构的特殊工具。它将html转换为语义化的markdown格式,适合需要保留标题层级、链接标识和列表结构的场景。

import html2text
converter = html2text.html2text()
# 可选配置,例如忽略链接
converter.ignore_links = true
html = '<h1>大标题</h1><p>这是一个包含<a href="#" rel="external nofollow" >链接</a>的段落。</p>'
markdown_text = converter.handle(html)
print(markdown_text)
# 输出:
# 大标题
# ===
# 这是一个包含链接的段落。

到此这篇关于python去除html标签获取纯文本的四种方法的文章就介绍到这了,更多相关python提取html纯文本内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com