加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

python怎样实现提取html文本?办法是什么?

发布时间:2022-04-12 04:43:40 所属栏目:语言 来源:互联网
导读:这篇文章主要给大家分析python实现提取html文本的方法,小编觉得比较实用,对新手学习python有一定的帮助,因此分享给大家做个参考,感兴趣的朋友可以了解看看,接下来我们一起学习一下吧。 假设我们需要从各种网页中提取全文,并且要剥离所有HTML标记。通
     这篇文章主要给大家分析python实现提取html文本的方法,小编觉得比较实用,对新手学习python有一定的帮助,因此分享给大家做个参考,感兴趣的朋友可以了解看看,接下来我们一起学习一下吧。
 
    假设我们需要从各种网页中提取全文,并且要剥离所有HTML标记。通常,默认解决方案是使用BeautifulSoup软件包中的get_text方法,该方法内部使用lxml。这是一个经过充分测试的解决方案,但是在处理成千上万个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
 
 
    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'rnrn', 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 documentsn' % (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
 
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>文档(带有<head>和<body>等),只是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

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读