python提取html正文为txt,python 提取html文本的方法

假设我们需要从各种网页中提取全文,并且要剥离所有HTML标记。通常,默认解决方案是使用BeautifulSoup软件包中的get_text方法,该方法内部使用lxml。这是一个经过充分测试的解决方案,但是在处理成千上万个HTML文档时可能会非常慢。

通过用selectolax替换BeautifulSoup,您几乎可以免费获得5-30倍的加速!

这是一个简单的基准测试,可分析commoncrawl(`处理NLP问题时,有时您需要获得大量的文本集。互联网是文本的最大来源,但是不幸的是,从任意HTML页面提取文本是一项艰巨而痛苦的任务。

假设我们需要从各种网页中提取全文,并且要剥离所有HTML标记。通常,默认解决方案是使用BeautifulSoup软件包中的get_text方法,该方法内部使用lxml。这是一个经过充分测试的解决方案,但是在处理成千上万个HTML文档时可能会非常慢。

通过用selectolax替换BeautifulSoup,您几乎可以免费获得5-30倍的加速!这是一个简单的基准测试,可分析commoncrawl(https://commoncrawl.org/)的10,000个HTML页面:

# coding: utf-8

from time import time

import warc

from bs4 import BeautifulSoup

from selectolax.parser import HTMLParser

def get_text_bs(html):

tree = BeautifulSoup(html, 'lxml')

body = tree.body

if body is None:

return None

for tag in body.select('script'):

tag.decompose()

for tag in body.select('style'):

tag.decompose()

text = body.get_text(separator='\n')

return text

def get_text_selectolax(html):

tree = HTMLParser(html)

if tree.body is None:

return None

for tag in tree.css('script'):

tag.decompose()

for tag in tree.css('style'):

tag.decompose()

text = tree.body.text(separator='\n')

return text

def read_doc(record, parser=get_text_selectolax):

url = record.url

text = None

if url:

payload = record.payload.read()

header, html = payload.split(b'\r\n\r\n', maxsplit=1)

html = html.strip()

if len(html) > 0:

text = parser(html)

return url, text

def process_warc(file_name, parser, limit=10000):

warc_file = warc.open(file_name, 'rb')

t0 = time()

n_documents = 0

for i, record in enumerate(warc_file):

url, doc = read_doc(record, parser)

if not doc or not url:

continue

n_documents += 1

if i > limit:

break

warc_file.close()

print('Parser: %s' % parser.__name__)

print('Parsing took %s seconds and produced %s documents\n' % (time() - t0, n_documents))

>>> ! wget https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2018-05/segments/1516084886237.6/warc/CC-MAIN-20180116070444-20180116090444-00000.warc.gz

>>> file_name = "CC-MAIN-20180116070444-20180116090444-00000.warc.gz"

>>> process_warc(file_name, get_text_selectolax, 10000)

Parser: get_text_selectolax

Parsing took 16.170367002487183 seconds and produced 3317 documents

>>> process_warc(file_name, get_text_bs, 10000)

Parser: get_text_bs

Parsing took 432.6902508735657 seconds and produced 3283 documents

显然,这并不是对某些事物进行基准测试的最佳方法,但是它提供了一个想法,即selectolax有时比lxml快30倍。

selectolax最适合将HTML剥离为纯文本。如果我有10,000多个HTML片段,需要将它们作为纯文本索引到Elasticsearch中。(Elasticsearch有一个html_strip文本过滤器,但这不是我想要/不需要在此上下文中使用的过滤器)。事实证明,以这种规模将HTML剥离为纯文本实际上是非常低效的。那么,最有效的方法是什么?

PyQuery

from pyquery import PyQuery as pq

text = pq(html).text()

selectolax

from selectolax.parser import HTMLParser

text = HTMLParser(html).text()

正则表达式

import re

regex = re.compile(r'<.>')

text = clean_regex.sub('', html)

结果

我编写了一个脚本来计算时间,该脚本遍历包含HTML片段的10,000个文件。注意!这些片段不是完整的文档(带有

和等),只是HTML的一小部分。平均大小为10,314字节(中位数为5138字节)。结果如下:

pyquery

SUM:    18.61 seconds

MEAN:   1.8633 ms

MEDIAN: 1.0554 ms

selectolax

SUM:    3.08 seconds

MEAN:   0.3149 ms

MEDIAN: 0.1621 ms

regex

SUM:    1.64 seconds

MEAN:   0.1613 ms

MEDIAN: 0.0881 ms

我已经运行了很多次,结果非常稳定。重点是:selectolax比PyQuery快7倍。

正则表达式好用?真的吗?

对于最基本的HTML Blob,它可能工作得很好。实际上,如果HTML是

Foo&amp; Bar p>,我希望纯文本转换应该是Foo&Bar,而不是Foo&amp; bar。

更重要的一点是,PyQuery和selectolax支持非常特定但对我的用例很重要的内容。在继续之前,我需要删除某些标签(及其内容)。例如:

This should get stripped.

Please keep.

This should also get stripped.

正则表达式永远无法做到这一点。

2.0 版本

因此,我的要求可能会发生变化,但基本上,我想删除某些标签。例如:

。因此,让我们实现一下:

PyQuery

from pyquery import PyQuery as pq

_display_none_regex = re.compile(r'display:\s*none')

doc = pq(html)

doc.remove('div.warning, div.hidden')

for div in doc('div[style]').items():

style_value = div.attr('style')

if _display_none_regex.search(style_value):

div.remove()

text = doc.text()

selectolax

from selectolax.parser import HTMLParser

_display_none_regex = re.compile(r'display:\s*none')

tree = HTMLParser(html)

for tag in tree.css('div.warning, div.hidden'):

tag.decompose()

for tag in tree.css('div[style]'):

style_value = tag.attributes['style']

if style_value and _display_none_regex.search(style_value):

tag.decompose()

text = tree.body.text()

这实际上有效。当我现在为10,000个片段运行相同的基准时,新结果如下:

pyquery

SUM:    21.70 seconds

MEAN:   2.1701 ms

MEDIAN: 1.3989 ms

selectolax

SUM:    3.59 seconds

MEAN:   0.3589 ms

MEDIAN: 0.2184 ms

regex

Skip

同样,selectolax击败PyQuery约6倍。

结论

正则表达式速度快,但功能弱。selectolax的效率令人印象深刻。

以上就是python 提取html文本的方法的详细内容,更多关于python 提取html文本的资料请关注脚本之家其它相关文章!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac OS 通过配置窗口来连接远程主机

点击连接后&#xff0c;就跳到命令终端窗口中&#xff0c;输入远程主机 root 用户的登录密码&#xff0c;则完成连接。

温度补偿计算公式_一种工业用温度测量模块的设计与实现

一种工业用温度测量模块的设计与实现罗伯特侯0 引言温度是工业生产中最重要的参数之一&#xff0c;因此温度测量设备在工业领域不可或缺。热电偶是工业场合中应用最广泛的温度传感器,它的主要特点是测温范围宽,价格低&#xff0c;同时结构简单,坚固耐用。笔者采用高集成度、高精…

taskexecutor_弹簧和线程:TaskExecutor

taskexecutor在Web应用程序中使用线程并不罕见&#xff0c;尤其是当您必须开发长期运行的任务时。 考虑到spring&#xff0c;我们必须格外注意并使用它已经提供的工具&#xff0c;而不是生成我们自己的线程。 我们希望线程由spring管理&#xff0c;因此能够在没有任何影响的情…

Linux 命令之 find -- 查找文件和目录/搜索文件和目录

文章目录命令介绍语法格式常用选项文件类型参考示例&#xff08;一&#xff09;在当前目录及其子目录下搜索内容中含有“140.206.111.111”的所有文件&#xff08;二&#xff09;列出当前目录及其子目录下所有文件和目录&#xff08;三&#xff09;在指定目录下查找特定名称的文…

javaserver_什么是JavaServer Faces(JSF)–(第2部分)

javaserverFacelets声明语言 在第1部分中&#xff0c;我介绍了JavaServer Pages&#xff08;JSF&#xff09;背后的基本思想 。 在本文中&#xff0c;我想介绍Facelets声明语言 。 HTML标签 我们遇到的第一个标签是代表HTML元素HTML标签。 这些实际上只是HTML标记&#xff08;…

微博如何发订阅消息_微信订阅号或将大变天,微博8年前就这么干了...

近日&#xff0c;微信又偷偷的做了一个大胆的尝试&#xff0c;将公众号消息排序改版&#xff0c;不再按照一直以来的“时间轴展示”&#xff0c;而是学起了微博&#xff0c;变成了“智能排序”。微信的“阅读效率优化”排序不过可能是为了独树一帜&#xff0c;微信管这种排序方…

html怎么填充颜色渐变,CSS实现不规则图形,填充渐变色

JS Bin/* 背景图片实现 */.background-box {width: 400px;height: 100px;/* 透明色替换为当前背景底色 */background:linear-gradient(-135deg, transparent 50px, red , yellow) top right;background-size: 50% 50%;background-repeat: no-repeat;}/* 边框实现 */.border-box…

Linux 命令之 locate -- 文件查找工具(查找文件/搜索文件)

文章目录一、命令介绍二、相关文件说明配置文件 updatedb.conf三、更新数据库四、常用选项五、命令示例搜索文件名以指定字符串开头的文件查找名称中含有指定字符串的文件使用正则表达式查找特定条件的文件一、命令介绍 locate 命令用来查找文件或目录。 locate 命令要比 find…

算法正义_正义联盟的Sprint Boot

算法正义正义联盟&#xff08;Justice League&#xff09;进入了黑暗时代&#xff0c;强大的Darkseid征服了人类。 蝙蝠侠在《神力女超人》的帮助下&#xff0c;努力使联盟与一个关键方面失联。 适当的正义联盟成员管理系统。 由于时间不在他们身边&#xff0c;他们不想经历繁琐…

indesign如何画弧线_彩铅画入门教程,如何给独角兽设计一款好发型

戳这里 → 查看“爱蜜干货文章目录”本次综合训练的目的1&#xff0e;挖掘你的绘画感和想象力&#xff0c;彩色鬃毛色彩大家可以自由发挥哦&#xff01;2.练习彩铅的长线条&#xff0c;现在练习的长条还是比较简单的&#xff0c;下次综合训练我们还会练习更加复杂的3.彩铅这种画…

微型计算机作为载体的部件是,大工11秋《计算机应用基础》辅导资料二

计算机应用基础辅导资料二主题&#xff1a;计算机基础知识的辅导资料学习时间&#xff1a;2011年10月10日&#xff0d;10月16日内容&#xff1a;这周我们主要学习课件&#xff0e;&#xff0e;第二章计算机的基础知识&#xff0c;本章的学习要求及需要掌握的重点内容如下&#…

Linux 命令之 whereis -- 显示命令及相关文件的路径

文章目录一、命令介绍二、选项参数三、参考示例&#xff08;一&#xff09;显示 ln 命令的程序和 man 手册页的位置&#xff08;二&#xff09;显示 tomcat 相关文件的路径一、命令介绍 whereis 命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。 wher…

markdown如何设置图片大小_Gitee(码云)实现免费 Markdown 图床

“阅读本文大概需要 6 分钟前言Markdown是一种易于上手的轻量级标记语言&#xff0c;由于其目的在于注重文字内容而不是排版&#xff0c;目前很受大家欢迎&#xff0c;写完一篇文档可以直接复制到其他各大平台上&#xff0c;不用担心格式字体等混乱问题但是文章中如果引用了某个…

json-tree api_什么是JSON处理(JSON-P API)?

json-tree apiJava EE中的JSON-P简介 JSON处理1.0&#xff08; JSR 353 &#xff09;的Java API是一个低级&#xff0c;轻量级的JSON解析器和生成器&#xff0c;它提供了在属性和值级别上操作JSON数据的能力。 JSR 353提供了两种JSON处理模型&#xff1a; 对象模型和流模型。 …

适合利用计算机模拟的是,计算机模拟在数学建模中的应用

计算机模拟在数学建模中的应用计算机模拟是按时间来划分的&#xff0c;因为计算机模拟实质上是系统随时间变化而变化的动态写照&#xff0c;以下是小编搜集整理的一篇探究计算机模拟在数学建模应用的论文范文&#xff0c;供大家阅读参考。【摘要】本文主要阐述了如何利用计算机…

噪音声压和声功率的区别_南昌汽车隔音,深入了解汽车噪音的来源、危害以及解决方案...

汽车噪音带来的危害&#xff1a;汽车噪音对人体健康的影响是多方面的。噪音作用于人的中枢神经系统&#xff0c;使人们大脑皮层的兴奋与抑制平衡失调&#xff0c;导致条件反射异常&#xff0c;使脑血管张力遭到损害。这些生理上的变化&#xff0c;在早期能够恢复原状&#xff0…

Linux 命令之 which -- 查找并显示给定命令的绝对路径(查找命令的位置/查询命令的位置/搜索命令的位置/查看命令的位置)

文章目录一、命令介绍二、选项参数三、参考示例&#xff08;一&#xff09;查找 java 命令的位置一、命令介绍 which 命令的作用是在 PATH 变量指定的路径中&#xff0c;搜索某个系统命令的位置&#xff0c;并且返回第一个搜索结果。 运维人员在日常工作中经常使用 which 命令…

lua加密教程_我们相信加密! 教程

lua加密教程许多人认为加密是一个复杂的主题&#xff0c;这很难理解。 可以实现其某些方面&#xff0c;但是每个人都可以理解它在更高层次上的工作方式。 这就是我要处理的这篇文章。 用简单的术语解释它是如何工作的&#xff0c;然后使用一些代码。 是的&#xff0c;我们信任…

生产用计算机软件管理台账,计算机台账管理系统

计算机台账管理系统计算机台账管理系统是什么&#xff1f;什么是计算机台账管理系统&#xff1f;对于设备管理而言&#xff0c;设备台账是其重要的组成部分&#xff0c;计算机台账管理系统对设备的编号、适用规格、年限、使用部门等具体信息进行管理&#xff0c;方便设备资产的…

Linux 查看数据库MySQL安装文件和安装目录的命令

文章目录数据库 MySQL 相关目录说明/var/lib/mysql/usr/bin/usr/share/mysql/usr/lib/mysql/etc/my.cnf查看 MySQL 相关文件/目录的命令查看已安装的 MySQL 相关软件包名称查看某个软件包的所有安装文件查看 MySQL 相关的所有文件使用命令 find 查找含有 mysql 关键字的文件路径…