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

 更新时间:2026年05月14日 08:15:48   作者:detayun  
这篇文章主要为大家详细介绍了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纯文本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python面向对象程序设计示例小结

    Python面向对象程序设计示例小结

    这篇文章主要介绍了Python面向对象程序设计,结合实例形式总结分析了Python面向对象程序设计中比较常见的类定义、实例化、继承、私有变量等相关使用技巧与操作注意事项,需要的朋友可以参考下
    2019-01-01
  • Django项目中使用JWT的实现代码

    Django项目中使用JWT的实现代码

    这篇文章主要介绍了Django项目中使用JWT的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 基于Python实现自动关机小工具

    基于Python实现自动关机小工具

    上班族经常会遇到这样情况,着急下班结果将关机误点成重启,或者临近下班又通知开会,开完会已经迟了还要去给电脑关机。今天使用PyQt5做了个自动关机的小工具,设置好关机时间然后直接提交即可,需要的可以参考一下
    2022-10-10
  • Python入门_浅谈数据结构的4种基本类型

    Python入门_浅谈数据结构的4种基本类型

    下面小编就为大家带来一篇Python入门_浅谈数据结构的4种基本类型。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python多进程协作模拟实现流程

    Python多进程协作模拟实现流程

    当多个进程使用同一份数据资源的时候,因为进程的运行没有顺序,运行起来也无法控制,如果不加以干预,往往会引发数据安全或顺序混乱的问题,所以要在多个进程读写共享数据资源的时候加以适当的策略,来保证数据的一致性问题
    2023-01-01
  • Python range函数之生成器函数的示例

    Python range函数之生成器函数的示例

    这篇文章主要介绍了Python range函数之生成器函数的示例,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Python查询缺失值的4种方法总结

    Python查询缺失值的4种方法总结

    缺失值可能是数据科学中最不受欢迎的值,然而,它们总是在身边。忽略缺失值也是不合理的,因此我们需要找到有效且适当地处理它们的方法。本文总结了四个Python查询缺失值的方法,需要的可以参考一下
    2022-05-05
  • python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法

    python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法

    这篇文章给大家分享了关于python安装PIL模块时遇到Unable to find vcvarsall.bat错误的解决方法,相信会对不少人有一定的参考借鉴价值。有需要的朋友们下面来一起看看吧。
    2016-09-09
  • django中日志模块logging的配置和使用方式

    django中日志模块logging的配置和使用方式

    文章主要介绍了如何在Django项目的`settings.py`文件中配置日志记录,并使用日志模块记录不同级别的日志,日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL,级别越高,记录的日志越详细,通过配置和使用日志记录器,可以更好地排查和监控系统问题
    2025-01-01
  • python中reload(module)的用法示例详解

    python中reload(module)的用法示例详解

    与from和import相比,reload是内置函数,而不是语句,下面这篇文章主要给大家介绍了关于python中reload(module)用法的相关资料,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-09-09

最新评论