python如何提取html文本
本篇内容主要讲解“python如何提取html文本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“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的10,000个HTML页面:
#coding:utf-8fromtimeimporttimeimportwarcfrombs4importBeautifulSoupfromselectolax.parserimportHTMLParserdefget_text_bs(html):tree=BeautifulSoup(html,'lxml')body=tree.bodyifbodyisNone:returnNonefortaginbody.select('script'):tag.decompose()fortaginbody.select('style'):tag.decompose()text=body.get_text(separator='')returntextdefget_text_selectolax(html):tree=HTMLParser(html)iftree.bodyisNone:returnNonefortagintree.css('script'):tag.decompose()fortagintree.css('style'):tag.decompose()text=tree.body.text(separator='')returntextdefread_doc(record,parser=get_text_selectolax):url=record.urltext=Noneifurl:payload=record.payload.read()header,html=payload.split(b'',maxsplit=1)html=html.strip()iflen(html)>0:text=parser(html)returnurl,textdefprocess_warc(file_name,parser,limit=10000):warc_file=warc.open(file_name,'rb')t0=time()n_documents=0fori,recordinenumerate(warc_file):url,doc=read_doc(record,parser)ifnotdocornoturl:continuen_documents+=1ifi>limit:breakwarc_file.close()print('Parser:%s'%parser.__name__)print('Parsingtook%ssecondsandproduced%sdocuments'%(time()-t0,n_documents))
>>>!wgethttps://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_selectolaxParsingtook16.170367002487183secondsandproduced3317documents>>>process_warc(file_name,get_text_bs,10000)Parser:get_text_bsParsingtook432.6902508735657secondsandproduced3283documents
显然,这并不是对某些事物进行基准测试的最佳方法,但是它提供了一个想法,即selectolax有时比lxml快30倍。
selectolax最适合将HTML剥离为纯文本。如果我有10,000多个HTML片段,需要将它们作为纯文本索引到Elasticsearch中。(Elasticsearch有一个html_strip文本过滤器,但这不是我想要/不需要在此上下文中使用的过滤器)。事实证明,以这种规模将HTML剥离为纯文本实际上是非常低效的。那么,最有效的方法是什么?
PyQuery
frompyqueryimportPyQueryaspqtext=pq(html).text()
selectolax
fromselectolax.parserimportHTMLParsertext=HTMLParser(html).text()
正则表达式
importreregex=re.compile(r'<.*?>')text=clean_regex.sub('',html)结果
我编写了一个脚本来计算时间,该脚本遍历包含HTML片段的10,000个文件。注意!这些片段不是完整的<html>文档(带有<head>和<body>等),只是HTML的一小部分。平均大小为10,314字节(中位数为5138字节)。结果如下:
pyquerySUM:18.61secondsMEAN:1.8633msMEDIAN:1.0554msselectolaxSUM:3.08secondsMEAN:0.3149msMEDIAN:0.1621msregexSUM:1.64secondsMEAN:0.1613msMEDIAN:0.0881ms
我已经运行了很多次,结果非常稳定。重点是:selectolax比PyQuery快7倍。
正则表达式好用?真的吗?对于最基本的HTML Blob,它可能工作得很好。实际上,如果HTML是<p> Foo&amp; Bar </ p>,我希望纯文本转换应该是Foo&Bar,而不是Foo&amp; bar。
更重要的一点是,PyQuery和selectolax支持非常特定但对我的用例很重要的内容。在继续之前,我需要删除某些标签(及其内容)。例如:
<h5class="warning">Thisshouldgetstripped.</h5><p>Pleasekeep.</p><div>Thisshouldalsogetstripped.</div>
正则表达式永远无法做到这一点。
2.0 版本因此,我的要求可能会发生变化,但基本上,我想删除某些标签。例如:<div class =“ warning”> 、 <div class =“ hidden”> 和 <div style =“ display:none”>。因此,让我们实现一下:
PyQuery
frompyqueryimportPyQueryaspq_display_none_regex=re.compile(r'display:s*none')doc=pq(html)doc.remove('div.warning,div.hidden')fordivindoc('div[style]').items():style_value=div.attr('style')if_display_none_regex.search(style_value):div.remove()text=doc.text()
selectolax
fromselectolax.parserimportHTMLParser_display_none_regex=re.compile(r'display:s*none')tree=HTMLParser(html)fortagintree.css('div.warning,div.hidden'):tag.decompose()fortagintree.css('div[style]'):style_value=tag.attributes['style']ifstyle_valueand_display_none_regex.search(style_value):tag.decompose()text=tree.body.text()
这实际上有效。当我现在为10,000个片段运行相同的基准时,新结果如下:
pyquerySUM:21.70secondsMEAN:2.1701msMEDIAN:1.3989msselectolaxSUM:3.59secondsMEAN:0.3589msMEDIAN:0.2184msregexSkip
同样,selectolax击败PyQuery约6倍。
到此,相信大家对“python如何提取html文本”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。