Python中五种不同解析库的应用与提取速度对比

 更新时间:2025年05月30日 10:27:27   作者:失败又激情的man  
这篇文章主要为大家详细介绍了Python中五种不同解析库的应用与提取速度对比,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

今天闲着没事,突发异想,相对比不同解析库的解析速度,本文中对比五种解析库

一、概述

1.scrapy自带Css选择

2.scrapy自带xpath

3.lxml自带xpath     from lxml import etree

4.bs4自带美味的汤 from bs4 import BeautifulSoup

5.re 正则表达式

以这个文本为例,在循环解析链接标题时间情况,再循环499次并打印输出,约循环7500次,为了避免误差,考虑到CPU资源波动,那么Python程序能够得到的CPU时间就会或多或少,从而导致运行时间变长或变短,所以每种方式运行三次。

当CPU爆满时

 运行时间非常慢

当CPU充足时,同样是程序就会非常快

本程序都在CPU充足情况下运行

text ='''<div class="news_list zy_listbox">
                        <!-- 展示15条数据后出现分页 -->
                        <ul>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2565" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-010号</a><span>2024-07-18</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2564" rel="external nofollow"  rel="external nofollow" >单一来源采购公示</a><span>2024-07-15</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2563" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-009号(第二次)</a><span>2024-07-10</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2562" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-009号</a><span>2024-07-05</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2561" rel="external nofollow"  rel="external nofollow" >等保测评询价函</a><span>2024-05-28</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2560" rel="external nofollow"  rel="external nofollow" >单一来源采购公示</a><span>2024-05-24</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2559" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-007号(第二次)</a><span>2024-05-20</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2558" rel="external nofollow"  rel="external nofollow" >单一来源采购公示</a><span>2024-05-16</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2557" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-008号</a><span>2024-05-06</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2556" rel="external nofollow"  rel="external nofollow" >询价函</a><span>2024-04-30</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2555" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-007号</a><span>2024-04-22</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2554" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2023-004号(第二次)</a><span>2024-04-12</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2553" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-006号</a><span>2024-03-29</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2552" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-005号</a><span>2024-03-20</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2551" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-004号</a><span>2024-03-16</span></li>
                            
                        </ul>
                    </div>'''

二、探讨CSS选择器解析速度

t= time.time()
selector = Selector(text=text)
for i in range(1,500):
    for l in selector.css('div.news_list>ul>li'):
        print(l.css('a::text').get())
        print(l.css('span::text').get())
        print(l.css('a::attr(href)').get())
css_parse = time.time()-t
print('css_parse用时:',css_parse)

第一次

第二次

第三次

三、探讨scrapy里的xpath解析速度

t= time.time()
selector = Selector(text=text)
for i in range(1,500):
    for l in selector.xpath('//div[@class = "news_list zy_listbox"]/ul/li'):
        print(l.xpath('.//a/text()').get())
        print(l.xpath('.//span/text()').get())
        print(l.xpath('.//a/@href').get())
scrapy_xpath_parse = time.time()-t
print('scrapy_xpath_parse用时:',scrapy_xpath_parse)

第一次

第二次

第三次

四、探讨lxml里的xpath解析速度

t= time.time()
selector = etree.HTML(text)
for i in range(1,500):
    for l in selector.xpath('//div[@class = "news_list zy_listbox"]/ul/li'):
        print(l.xpath('.//a/text()')[0])
        print(l.xpath('.//span/text()')[0])
        print(l.xpath('.//a/@href')[0])
xpath_parse = time.time()-t
print('xpath_parse用时:',xpath_parse)

第一次

第二次

第三次

五、探讨bs4自带BeautifulSoup解析速度

t = time.time()
soup = BeautifulSoup(text, 'html.parser')
news_list = soup.select('div.news_list.zy_listbox ul li')
for i in range(1,500):
    for l in news_list:
        print( l.select_one('a').get_text(strip=True))
        print(l.select_one('span').get_text(strip=True))
        print(l.select_one('a')['href'])
bs_parse = time.time() - t
print('bs_parse用时:',bs_parse )

第一次

第二次

第三次

六、探讨re正则解析速度

t = time.time()
li = re.findall(' <li><b>·</b>.*?</li>',text)
for l in range(1,500):
    for i in li:
        print(re.search('>(.*?)</a>',i).group(1))
        print(re.search('<span>(.*?)</span>',i).group(1))
        print(re.search('<a href="(.*?)" rel="external nofollow"  rel="external nofollow" >',i).group(1))
re_time = time.time()-t
print('re:',re_time )

第一次

第二次

第三次

七、总结 

经上述程序实验证明,速度排序:

re正则  > lxml  xpath  >  bs4   BeautifulSoup  >   Scrapy  css   ≈    Scrapy  xpath

在本实验中,并不严谨,除CPU波动外,只选取了一种特定的HTML网页进行速度对比,没有考虑到不同类型和结构的网页对解析速度的影响。例如,网页中若包含大量嵌套的表单、复杂的JavaScript生成的动态内容等,甚至有个html藏在动态接口的json里面,不同解析工具的表现可能会大不相同,这使得实验结果存在一定的局限性。实际应用中还需要根据具体的HTML网页结构、解析需求以及性能指标等多方面因素综合考量,选择最合适的解析工具。

总程序

from lxml import etree
from scrapy import Selector
from bs4 import BeautifulSoup
import re
import requests
import time
text ='''<div class="news_list zy_listbox">
                        <!-- 展示15条数据后出现分页 -->
                        <ul>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2565" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-010号</a><span>2024-07-18</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2564" rel="external nofollow"  rel="external nofollow" >单一来源采购公示</a><span>2024-07-15</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2563" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-009号(第二次)</a><span>2024-07-10</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2562" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-009号</a><span>2024-07-05</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2561" rel="external nofollow"  rel="external nofollow" >等保测评询价函</a><span>2024-05-28</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2560" rel="external nofollow"  rel="external nofollow" >单一来源采购公示</a><span>2024-05-24</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2559" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-007号(第二次)</a><span>2024-05-20</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2558" rel="external nofollow"  rel="external nofollow" >单一来源采购公示</a><span>2024-05-16</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2557" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-008号</a><span>2024-05-06</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2556" rel="external nofollow"  rel="external nofollow" >询价函</a><span>2024-04-30</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2555" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-007号</a><span>2024-04-22</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2554" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2023-004号(第二次)</a><span>2024-04-12</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2553" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-006号</a><span>2024-03-29</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2552" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-005号</a><span>2024-03-20</span></li>
                                                        <li><b>·</b><a href="/index/Article/detail.html?id=2551" rel="external nofollow"  rel="external nofollow" >青海省生态环境监测中心自行采购2024-004号</a><span>2024-03-16</span></li>
                            
                        </ul>
                    </div>'''
t= time.time()
selector = Selector(text=text)
for i in range(1,500):
    for l in selector.css('div.news_list>ul>li'):
        print(l.css('a::text').get())
        print(l.css('span::text').get())
        print(l.css('a::attr(href)').get())
css_parse = time.time()-t
t= time.time()
selector = Selector(text=text)
for i in range(1,500):
    for l in selector.xpath('//div[@class = "news_list zy_listbox"]/ul/li'):
        print(l.xpath('.//a/text()').get())
        print(l.xpath('.//span/text()').get())
        print(l.xpath('.//a/@href').get())
scrapy_xpath_parse = time.time()-t
t= time.time()
selector = etree.HTML(text)
for i in range(1,500):
    for l in selector.xpath('//div[@class = "news_list zy_listbox"]/ul/li'):
        print(l.xpath('.//a/text()')[0])
        print(l.xpath('.//span/text()')[0])
        print(l.xpath('.//a/@href')[0])
xpath_parse = time.time()-t
t = time.time()
soup = BeautifulSoup(text, 'html.parser')
news_list = soup.select('div.news_list.zy_listbox ul li')
for i in range(1,500):
    for l in news_list:
        print( l.select_one('a').get_text(strip=True))
        print(l.select_one('span').get_text(strip=True))
        print(l.select_one('a')['href'])
bs_parse = time.time() - t
t = time.time()
li = re.findall(' <li><b>·</b>.*?</li>',text)
for l in range(1,500):
    for i in li:
        print(re.search('>(.*?)</a>',i).group(1))
        print(re.search('<span>(.*?)</span>',i).group(1))
        print(re.search('<a href="(.*?)" rel="external nofollow"  rel="external nofollow" >',i).group(1))
re_time = time.time()-t
print('css_parse用时:',css_parse)
print('scrapy_xpath_parse用时:',scrapy_xpath_parse)
print('xpath_parse用时:',xpath_parse)
print('bs_parse用时:',bs_parse )
print('re用时:',re_time )

各时间对比

到此这篇关于Python中五种不同解析库的应用与提取速度对比的文章就介绍到这了,更多相关Python解析库应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python的Tornado框架实现一个Web端图书展示页面

    使用Python的Tornado框架实现一个Web端图书展示页面

    Tornado是Python的一款高人气Web开发框架,这里我们来展示使用Python的Tornado框架实现一个Web端图书展示页面的实例,通过该实例可以清楚地学习到Tornado的模板使用及整个Web程序的执行流程.
    2016-07-07
  • 3种Python 实现酷炫进度条的实用方法

    3种Python 实现酷炫进度条的实用方法

    这篇文章主要介绍了3种Python 实现酷炫进度条的实用方法,文章围绕Python的相关资料展开对实现进度条的介绍,需要的小伙伴可以参考一下
    2022-04-04
  • python数据类型中的字符串你了解多少

    python数据类型中的字符串你了解多少

    这篇文章主要为大家详细介绍了python数据类型中的字符串,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Python 中 Selenium 的 getAttribute() 函数详解

    Python 中 Selenium 的 getAttribute() 

    本文将解释如何使用Selenium的getAttribute()方法,getAttribute() 方法可以检索元素属性,例如锚标记的 href 属性, 该函数最初将尝试返回指定属性的值,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • python Shapely使用指南详解

    python Shapely使用指南详解

    这篇文章主要介绍了python Shapely使用指南详解,需要的朋友可以参考下
    2020-02-02
  • 五分钟学会Python 模块和包、文件

    五分钟学会Python 模块和包、文件

    通过学习本文可以五分钟掌握Python 模块和包、文件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 利用OpenCV+Tensorflow实现的手势识别

    利用OpenCV+Tensorflow实现的手势识别

    这几天没事,想着再学点一些视觉识别方向的东西,因为之前做了验证码识别,有了机器学习的信心,因此这次打算做个手势识别,下面这篇文章主要给大家介绍了关于利用OpenCV+Tensorflow实现的手势识别的相关资料,需要的朋友可以参考下
    2022-11-11
  • Python获取Linux系统下的本机IP地址代码分享

    Python获取Linux系统下的本机IP地址代码分享

    这篇文章主要介绍了Python获取Linux系统下的本机IP地址代码分享,本文直接给出实现代码,可以获取到eth0等网卡的IP地址,需要的朋友可以参考下
    2014-11-11
  • Python如何将CSV文件转JSON文件

    Python如何将CSV文件转JSON文件

    这篇文章主要给大家介绍了关于Python如何将CSV文件转JSON文件的相关资料,可以使用Python内置的csv和json模块来实现将csv文件转为json的操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Python format字符串格式化函数的使用

    Python format字符串格式化函数的使用

    本文主要介绍了Python format字符串格式化函数的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论