本文介绍了四种从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()。
# 只提取 <div> 标签内的内容
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纯文本内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论