四大解析器(BeautifulSoup、PyQuery、lxml、正则)性能比较
用标题中的四种方式解析网页,比较其解析速度。当然比较结果数值与电脑配置,python版本都有关系,但总体差别不会很大。
下面是我的结果,lxml xpath最快,bs4最慢
- ==== Python version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] =====
- ==== Total trials: 10000 =====
- bs4 total time: 5.5
- pq total time: 0.9
- lxml (cssselect) total time: 0.8
- lxml (xpath) total time: 0.5
- regex total time: 1.1 (doesn't find all p)
以下是测试代码
- # -*- coding: utf-8 -*-
- """
- @Datetime: 2019/3/13
- @Author: Zhang Yafei
- """
- import re
- import sys
- import time
- import requests
- from lxml.html import fromstring
- from pyquery import PyQuery as pq
- from bs4 import BeautifulSoup as bs
- 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'}
- def Timer():
- a = time.time()
- while True:
- c = time.time()
- yield time.time() - a
- a = c
- # ################# start request #################
- timer = Timer()
- url = "https://www.python.org/"
- html = requests.get(url, headers=headers).text
- num = 10000
- print('\n==== Python version: %s =====' % sys.version)
- print('\n==== Total trials: %s =====' % num)
- next(timer)
- # ################# bs4 #########################
- soup = bs(html, 'lxml')
- for x in range(num):
- paragraphs = soup.findAll('p')
- t = next(timer)
- print('bs4 total time: %.1f' % t)
- # ################ pyquery #######################
- d = pq(html)
- for x in range(num):
- paragraphs = d('p')
- t = next(timer)
- print('pq total time: %.1f' % t)
- # ############### lxml css #########################
- tree = fromstring(html)
- for x in range(num):
- paragraphs = tree.cssselect('p')
- t = next(timer)
- print('lxml (cssselect) total time: %.1f' % t)
- # ############## lxml xpath #######################
- tree = fromstring(html)
- for x in range(num):
- paragraphs = tree.xpath('.//p')
- t = next(timer)
- print('lxml (xpath) total time: %.1f' % t)
- # ############### re ##########################
- for x in range(num):
- paragraphs = re.findall('<[p ]>.*?</p>', html)
- t = next(timer)
- print('regex total time: %.1f (doesn\'t find all p)\n' % t)
测试代码二
- # -*- coding: utf-8 -*-
- """
- @Datetime: 2019/3/13
- @Author: Zhang Yafei
- """
- import functools
- import re
- import sys
- import time
- import requests
- from bs4 import BeautifulSoup as bs
- from lxml.html import fromstring
- from pyquery import PyQuery as pq
- def timeit(fun):
- @functools.wraps(fun)
- def wrapper(*args, **kwargs):
- start_time = time.time()
- res = fun(*args, **kwargs)
- print('运行时间为%.6f' % (time.time() - start_time))
- return res
- return wrapper
- @timeit # time1 = timeit(time)
- def time1(n):
- return [i * 2 for i in range(n)]
- # ################# start request #################
- url = "https://www.taobao.com/"
- html = requests.get(url).text
- num = 10000
- print('\n==== Python version: %s =====' % sys.version)
- print('\n==== Total trials: %s =====' % num)
- @timeit
- def bs4_test():
- soup = bs(html, 'lxml')
- for x in range(num):
- paragraphs = soup.findAll('p')
- print('bs4 total time:')
- @timeit
- def pq_test():
- d = pq(html)
- for x in range(num):
- paragraphs = d('p')
- print('pq total time:')
- @timeit
- def lxml_css():
- tree = fromstring(html)
- for x in range(num):
- paragraphs = tree.cssselect('p')
- print('lxml (cssselect) total time:')
- @timeit
- def lxml_xpath():
- tree = fromstring(html)
- for x in range(num):
- paragraphs = tree.xpath('.//p')
- print('lxml (xpath) total time:')
- @timeit
- def re_test():
- for x in range(num):
- paragraphs = re.findall('<[p ]>.*?</p>', html)
- print('regex total time:')
- if __name__ == '__main__':
- bs4_test()
- pq_test()
- lxml_css()
- lxml_xpath()
- re_test()
测试结果
- ==== Python version: 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] =====
- ==== Total trials: 10000 =====
- bs4 total time:
- 运行时间为9.049424
- pq total time:
- 运行时间为0.899639
- lxml (cssselect) total time:
- 运行时间为0.841596
- lxml (xpath) total time:
- 运行时间为0.619440
- regex total time:
- 运行时间为1.207861
四大解析器(BeautifulSoup、PyQuery、lxml、正则)性能比较的更多相关文章
- Python HTML解析器BeautifulSoup(爬虫解析器)
BeautifulSoup简介 我们知道,Python拥有出色的内置HTML解析器模块——HTMLParser,然而还有一个功能更为强大的HTML或XML解析工具——BeautifulSoup(美味的 ...
- 转:Python网页解析:BeautifulSoup vs lxml.html
转自:http://www.cnblogs.com/rzhang/archive/2011/12/29/python-html-parsing.html Python里常用的网页解析库有Beautif ...
- 正则表达式、BeautifulSoup、Lxml进行性能对比
爬取方法 性能 使用难度 安装难度 正则表达式 快 困难 简单(内置) BeautifulSoup 慢 简单 简单 Lxml 快 简单 相对困难
- HTML解析器BeautifulSoup
BeautifulSoup是Python的一个库,可解析用urllib2抓取下来的HTML 1.Beautiful Soup 安装 可以利用 pip 来安装,在Python程序中导入 pip inst ...
- 爬虫----爬虫解析库Beautifulsoup模块
一:介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...
- 爬虫解析库——BeautifulSoup
解析库就是在爬虫时自己制定一个规则,帮助我们抓取想要的内容时用的.常用的解析库有re模块的正则.beautifulsoup.pyquery等等.正则完全可以帮我们匹配到我们想要住区的内容,但正则比较麻 ...
- 爬虫解析库BeautifulSoup的一些笔记
BeautifulSoup类使用 基本元素 说明 Tag 标签,最基本的信息组织单元,分别是<>和</>标明开头和结尾 Name 标签的名字,<p></p ...
- 爬虫解析库beautifulsoup
一.介绍 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库. #安装Beautiful Soup pip install beautifulsoup4 #安装解析 ...
- Beautiful Soup常见的解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快 ...
随机推荐
- c/c++ 多线程 参数传递
多线程 参数传递 1,值传递,拷贝一份新的给新的线程.线程1中有个int变量a,在线程1中启动线程2,参数是a的值,这时就会拷贝a,线程1和线程2不共享a. 2,引用传递,不拷贝一份新的给新的线程.线 ...
- 搭建Jetbrains家族IDE授权服务器
虽然VS号称宇宙第一IDE但是也有不方便的地方,如果你也是C#码农我不得不向你推荐一个强大的插件ReSharper,他会是你的开发更加便捷,大大加快了开发的速度以及开发的乐趣.但是ReSharper并 ...
- 初学Django项目可能会遇到的问题
1. 出现莫名其妙的 app01 我项目中的app名字并不是app01,可是运行python manage.py makemigrations的时候总是提示app01不是已安装的app Applyin ...
- 【Linux基础】判断当前机器是虚拟机还是物理机
1.使用dmidecode命令查看(root权限) DMI (Desktop Management Interface, DMI)的主要组成部分是Management InformationForma ...
- solr 7.7 搭建和搜索
最近做了个solr搜索的demo, 用的是solr7.7,之前网上好多文章搭建solr都是5.5+tomcat.. 自己摆弄了下,发现solr7.7和5.5 的部分文件夹有些改动,没有深究原理也就没有 ...
- Zookeeper集群为什么要是单数
(原) 在zookeeper集群中,会有三种角色,leader. follower. observer分别对应着总统.议员.观察者. 半数以上投票通过:可以这样理解.客户端的增删改操作无论访问到了哪台 ...
- Linux查询进程和结束进程
1. ps -ef |grep redis ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. ...
- jquery.amaran jquery提示类使用
<script src="ing/js/jquery-1.8.3.min.js"></script> <link rel="styleshe ...
- 聊聊基准测试的MVP方案
上篇博客介绍了基准测试的一些思路和方法策略,这篇博客,聊聊基准测试的MVP(最小可行性方案)... 思维导图 一.测试策略 策略名称 阈值 运行时间 性能指标 基线 注释 并发测试 CPU75%+Er ...
- Django组件 之 分页器(paginator)
--------------------------------------------------------------------------------路虽远,行则将至. 事虽难,做则必成. ...