Python3,通过re模块中的sub()和findall()2个方法提升爬虫提取数据的效率
来源:互联网 发布:淘宝店家关闭订单,投诉 编辑:程序博客网 时间:2024/05/18 00:17
直接上Demo:
测试数据 - HTML:
'''<div id=\"songs-list\">""<h2 class=\"title\">各种汽车</h2>""<p class=\"introduction\">""各种汽车列表""</p>""<ul id=\"list\" class=\"list-group\">""<li data-view=\"2\">奥迪TT</li>""<li data-view=\"7\">""<a href=\"/2.png\" type=\"大众\">CC</a>""</li>""<li data-view=\"4\" class=\"active\">""<a href=\"/3.png\" type=\"宝马\">Mini</a>""</li>""<li data-view=\"6\"><a href=\"/4.png\" type=\"奥迪\">Q7</a></li>""<li data-view=\"5\"><a href=\"/5.png\" type=\"吉利\">金刚</a></li>""<li data-view=\"5\">""<a href=\"/6.png\" type=\"大众\"><i class=\"fa fa-user\"></i>速腾</a>""</li>""</ul>" "</div>'''
HTML结构分析,
思路1,若想要获取每类汽车下面的具体汽车名字,python需要去解析HTML中的节点,有的汽车名,
1。裸露在'<li></li>'标签下,
2。有的在'<li><a></a></li>'标签下,
通过上面分析,我们构造的正则需要匹配上面2种情况,如下:
"<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>"
用于匹配HTML中所有标签:'<a></a>' ,
"<a.*?>|</a>"
"<li.*?>(\w+)</li>"
测试Python代码:
import reimport timedef reTest1(str2): """ 比较re模块下findall() 与findall()+sub()提取页面数据效率和复杂程度 """ #匹配规则 part = r"<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>" #实际操作页面时,re.S,使通配符可以匹配换行符 ret = re.findall(part, str2, re.S) for i in ret: print(i[1])def reTest2(str2): """ 比较re模块下findall() 与findall()+sub()提取页面数据效率和复杂程度 """ #匹配规则 part = r"<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>" #想法:通过re模块sub()方法去掉标签:<a></a> #sub(RegExp, NewString, oldString, args) #RegExp: 匹配规则 #NewString: 想要要替换的字符串 #oldString: 原始字符串 #args: re.S ... subStr = re.sub("<a.*?>|</a>", "", str2, re.S) #实际操作页面时,re.S,使通配符可以匹配换行符 ret = re.findall("<li.*?>(\w+)</li>", subStr, re.S) for i in ret: print(i)if __name__ == "__main__": str2 = ("'''<div id=\"Car-list\">""<h2 class=\"title\">各种汽车</h2>""<p class=\"introduction\">""各种汽车列表" "</p>""<ul id=\"list\" class=\"list-group\">""<li data-view=\"2\">奥迪TT</li>""<li data-view=\"7\">""<a href=\"/2.png\" type=\"大众\">CC</a>""</li>""<li data-view=\"4\" class=\"active\">""<a href=\"/3.png\" type=\"宝马\">Mini</a>""</li>""<li data-view=\"6\"><a href=\"/4.png\" type=\"奥迪\">Q7</a></li>""<li data-view=\"5\"><a href=\"/5.png\" type=\"吉利\">金刚</a></li>""<li data-view=\"5\">""<a href=\"/6.png\" type=\"大众\"><i class=\"fa fa-user\"></i>速腾</a>""</li>""</ul>""</div>'''") #测试1:find() start1 = time.time() reTest1(str2) end1 = time.time() print("*"*50) #测试2,find()+sub() start2 = time.time() reTest2(str2) end2 = time.time() print("*"*50) print("通过find()直接提取目标数据,所用时间Time1:") print(end1 - start1) print("") print("通过sub() + find()提取目标数据,所用时间Time2:") print(end2 - start2) print("") print("时间差:") print("Time1 - Time2=", (end1-start1)-(end2-start2))
测试结果:
总结:
测试结果中,很明显,思路2比思路1提取数据效率明显高,re模块中各种方法组合一起有奇效
大量数据中,在保证精准的前提下,提升数去获取的效率也是很重要的
阅读全文
0 0
- Python3,通过re模块中的sub()和findall()2个方法提升爬虫提取数据的效率
- Python3的re.match()、re.search()和re.findall()
- Python3的re.match()、re.search()和re.findall()
- python的re模块的sub方法
- Python中的re.search和re.findall之间的区别
- python3 正则匹配 re.split,re.finditer,re.findall 方法
- Python中的re.search和re.findall之间的区别2
- re模块:findall()
- python re模块 sub方法介绍
- python re的findall和finditer
- kettle 数据提取效率提升
- python re 模块 findall 函数
- Python 正则re模块之compile()和findall()详解
- Python中正则表达式re模块-compile()和findall()
- python3 正则模块 re.compile、re.match、re.search 方法
- python error之re模块的findall与match错误
- python爬虫(1.find和findAll函数提取文本)
- python re.findall()使用2个模型查找返回包含tuple的list
- 如何做科研20171206
- HashMap1.8中多线程扩容引起的死循环问题
- 9张图带你了解全宇宙最神秘的团体——程序员
- 冬日暖阳!网易大数据应用与分析实践分享沙龙【北京站 12.16】
- 论剑大数据技术,效率为王!天善智能掘金数据技术沙龙【上海站 12.09】
- Python3,通过re模块中的sub()和findall()2个方法提升爬虫提取数据的效率
- 不懂这25个名词,好意思说你懂大数据?
- Solidity教程序列1
- 图的遍历之 深度优先搜索和广度优先搜索
- shiny动态仪表盘应用 | 中国世界自然文化遗产可视化案例
- 走进R语言的世界——简单数据处理
- JQuery 动态时间
- JMS(Java消息服务)(Activemq简单介绍)
- rpm常用命令及rpm参数介绍