用标题中的四种方式解析网页,比较其解析速度。当然比较结果数值与电脑配置,python版本都有关系,但总体差别不会很大。

下面是我的结果,lxml xpath最快,bs4最慢

  1. ==== Python version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] =====
  2.  
  3. ==== Total trials: 10000 =====
  4. bs4 total time: 5.5
  5. pq total time: 0.9
  6. lxml (cssselect) total time: 0.8
  7. lxml (xpath) total time: 0.5
  8. regex total time: 1.1 (doesn't find all p)

 以下是测试代码

  1. # -*- coding: utf-8 -*-
  2.  
  3. """
  4. @Datetime: 2019/3/13
  5. @Author: Zhang Yafei
  6. """
  7. import re
  8. import sys
  9. import time
  10. import requests
  11. from lxml.html import fromstring
  12. from pyquery import PyQuery as pq
  13. from bs4 import BeautifulSoup as bs
  14.  
  15. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
  16.  
  17. def Timer():
  18. a = time.time()
  19. while True:
  20. c = time.time()
  21. yield time.time() - a
  22. a = c
  23.  
  24. # ################# start request #################
  25. timer = Timer()
  26. url = "https://www.python.org/"
  27. html = requests.get(url, headers=headers).text
  28. num = 10000
  29. print('\n==== Python version: %s =====' % sys.version)
  30. print('\n==== Total trials: %s =====' % num)
  31. next(timer)
  32.  
  33. # ################# bs4 #########################
  34. soup = bs(html, 'lxml')
  35. for x in range(num):
  36. paragraphs = soup.findAll('p')
  37. t = next(timer)
  38. print('bs4 total time: %.1f' % t)
  39. # ################ pyquery #######################
  40. d = pq(html)
  41. for x in range(num):
  42. paragraphs = d('p')
  43. t = next(timer)
  44. print('pq total time: %.1f' % t)
  45. # ############### lxml css #########################
  46. tree = fromstring(html)
  47. for x in range(num):
  48. paragraphs = tree.cssselect('p')
  49. t = next(timer)
  50. print('lxml (cssselect) total time: %.1f' % t)
  51. # ############## lxml xpath #######################
  52. tree = fromstring(html)
  53. for x in range(num):
  54. paragraphs = tree.xpath('.//p')
  55. t = next(timer)
  56. print('lxml (xpath) total time: %.1f' % t)
  57. # ############### re ##########################
  58. for x in range(num):
  59. paragraphs = re.findall('<[p ]>.*?</p>', html)
  60. t = next(timer)
  61. print('regex total time: %.1f (doesn\'t find all p)\n' % t) 

测试代码二

  1. # -*- coding: utf-8 -*-
  2.  
  3. """
  4. @Datetime: 2019/3/13
  5. @Author: Zhang Yafei
  6. """
  7. import functools
  8. import re
  9. import sys
  10. import time
  11.  
  12. import requests
  13. from bs4 import BeautifulSoup as bs
  14. from lxml.html import fromstring
  15. from pyquery import PyQuery as pq
  16.  
  17. def timeit(fun):
  18. @functools.wraps(fun)
  19. def wrapper(*args, **kwargs):
  20. start_time = time.time()
  21. res = fun(*args, **kwargs)
  22. print('运行时间为%.6f' % (time.time() - start_time))
  23. return res
  24.  
  25. return wrapper
  26.  
  27. @timeit # time1 = timeit(time)
  28. def time1(n):
  29. return [i * 2 for i in range(n)]
  30.  
  31. # ################# start request #################
  32. url = "https://www.taobao.com/"
  33. html = requests.get(url).text
  34. num = 10000
  35. print('\n==== Python version: %s =====' % sys.version)
  36. print('\n==== Total trials: %s =====' % num)
  37.  
  38. @timeit
  39. def bs4_test():
  40. soup = bs(html, 'lxml')
  41. for x in range(num):
  42. paragraphs = soup.findAll('p')
  43. print('bs4 total time:')
  44.  
  45. @timeit
  46. def pq_test():
  47. d = pq(html)
  48. for x in range(num):
  49. paragraphs = d('p')
  50. print('pq total time:')
  51.  
  52. @timeit
  53. def lxml_css():
  54. tree = fromstring(html)
  55. for x in range(num):
  56. paragraphs = tree.cssselect('p')
  57. print('lxml (cssselect) total time:')
  58.  
  59. @timeit
  60. def lxml_xpath():
  61. tree = fromstring(html)
  62. for x in range(num):
  63. paragraphs = tree.xpath('.//p')
  64. print('lxml (xpath) total time:')
  65.  
  66. @timeit
  67. def re_test():
  68. for x in range(num):
  69. paragraphs = re.findall('<[p ]>.*?</p>', html)
  70. print('regex total time:')
  71.  
  72. if __name__ == '__main__':
  73. bs4_test()
  74. pq_test()
  75. lxml_css()
  76. lxml_xpath()
  77. re_test()

  测试结果

  1. ==== Python version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] =====
  2.  
  3. ==== Total trials: 10000 =====
  4. bs4 total time:
  5. 运行时间为9.049424
  6. pq total time:
  7. 运行时间为0.899639
  8. lxml (cssselect) total time:
  9. 运行时间为0.841596
  10. lxml (xpath) total time:
  11. 运行时间为0.619440
  12. regex total time:
  13. 运行时间为1.207861

  

 

四大解析器(BeautifulSoup、PyQuery、lxml、正则)性能比较的更多相关文章

  1. Python HTML解析器BeautifulSoup(爬虫解析器)

    BeautifulSoup简介 我们知道,Python拥有出色的内置HTML解析器模块——HTMLParser,然而还有一个功能更为强大的HTML或XML解析工具——BeautifulSoup(美味的 ...

  2. 转:Python网页解析:BeautifulSoup vs lxml.html

    转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html Python里常用的网页解析库有Beautif ...

  3. 正则表达式、BeautifulSoup、Lxml进行性能对比

    爬取方法 性能 使用难度 安装难度 正则表达式 快 困难 简单(内置) BeautifulSoup 慢 简单 简单 Lxml 快 简单 相对困难

  4. HTML解析器BeautifulSoup

    BeautifulSoup是Python的一个库,可解析用urllib2抓取下来的HTML 1.Beautiful Soup 安装 可以利用 pip 来安装,在Python程序中导入 pip inst ...

  5. 爬虫----爬虫解析库Beautifulsoup模块

    一:介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  6. 爬虫解析库——BeautifulSoup

    解析库就是在爬虫时自己制定一个规则,帮助我们抓取想要的内容时用的.常用的解析库有re模块的正则.beautifulsoup.pyquery等等.正则完全可以帮我们匹配到我们想要住区的内容,但正则比较麻 ...

  7. 爬虫解析库BeautifulSoup的一些笔记

    BeautifulSoup类使用   基本元素 说明 Tag 标签,最基本的信息组织单元,分别是<>和</>标明开头和结尾 Name 标签的名字,<p></p ...

  8. 爬虫解析库beautifulsoup

    一.介绍 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库. #安装Beautiful Soup pip install beautifulsoup4 #安装解析 ...

  9. Beautiful Soup常见的解析器

    Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快 ...

随机推荐

  1. c/c++ 多线程 参数传递

    多线程 参数传递 1,值传递,拷贝一份新的给新的线程.线程1中有个int变量a,在线程1中启动线程2,参数是a的值,这时就会拷贝a,线程1和线程2不共享a. 2,引用传递,不拷贝一份新的给新的线程.线 ...

  2. 搭建Jetbrains家族IDE授权服务器

    虽然VS号称宇宙第一IDE但是也有不方便的地方,如果你也是C#码农我不得不向你推荐一个强大的插件ReSharper,他会是你的开发更加便捷,大大加快了开发的速度以及开发的乐趣.但是ReSharper并 ...

  3. 初学Django项目可能会遇到的问题

    1. 出现莫名其妙的 app01 我项目中的app名字并不是app01,可是运行python manage.py makemigrations的时候总是提示app01不是已安装的app Applyin ...

  4. 【Linux基础】判断当前机器是虚拟机还是物理机

    1.使用dmidecode命令查看(root权限) DMI (Desktop Management Interface, DMI)的主要组成部分是Management InformationForma ...

  5. solr 7.7 搭建和搜索

    最近做了个solr搜索的demo, 用的是solr7.7,之前网上好多文章搭建solr都是5.5+tomcat.. 自己摆弄了下,发现solr7.7和5.5 的部分文件夹有些改动,没有深究原理也就没有 ...

  6. Zookeeper集群为什么要是单数

    (原) 在zookeeper集群中,会有三种角色,leader. follower. observer分别对应着总统.议员.观察者. 半数以上投票通过:可以这样理解.客户端的增删改操作无论访问到了哪台 ...

  7. Linux查询进程和结束进程

    1.  ps -ef |grep redis ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. ...

  8. jquery.amaran jquery提示类使用

    <script src="ing/js/jquery-1.8.3.min.js"></script> <link rel="styleshe ...

  9. 聊聊基准测试的MVP方案

    上篇博客介绍了基准测试的一些思路和方法策略,这篇博客,聊聊基准测试的MVP(最小可行性方案)... 思维导图 一.测试策略 策略名称 阈值 运行时间 性能指标 基线 注释 并发测试 CPU75%+Er ...

  10. Django组件 之 分页器(paginator)

    --------------------------------------------------------------------------------路虽远,行则将至.  事虽难,做则必成. ...