python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python提取HTML纯文本

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

作者:detayun

这篇文章主要为大家详细介绍了Python去除HTML标签获取纯文本的四种方法,主要是BeautifulSoup,正则表达式,html.parser和lxml,感兴趣的小伙伴可以了解下

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

具体实现方法如下:

方法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)
# 输出:这是标题这是正文内容,包含加粗文字。这是一个链接
# 只提取 &lt;div&gt; 标签内的内容
div_tag = soup.find('div', class_='article')
content = div_tag.get_text(strip=True)

追求性能:lxml

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

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纯文本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文