记得之前写过一篇文章,html2javaben,并发布了一个相关的组件,大概的功能就是把抓取的html页面后抽取其中的结构化数据进行二次加工。最近在用python也在写一个好玩的抓取网页的东西,也想封装一个python版的这样的组件用,想不到前后大概花了2个小时构思,2个小时编码就搞定了。想起了以前用java写这个东西时,总是免不了最后出来的东西让你特别有“成就感”,看这包名结构就知道了,呵呵。

现在就用python去实现这个功能,感受下这个愉快的过程.

我们还是以之前文章中的html代码做为示例:

姓名:

tony

员工编号:

ite00395

性别:

man

Email:

lihf@gggg.com

MSN:

lhf@hotmail.com

公司电话:

13712548548

移动电话:

1371489634

所属部门:

P后台项目组

部门地址:

现在我们需要抽取的数据是这样的格式:

{'Name':'tony','Work':'ite00395','Sex':'man','Email':'lihf@gggg.com','Msn':'lhf@hotmail.com','Phone':'13712548548','Mobile':'Mobile','Department':'P后台项目组','DeptAddress':''}

我希望封装的解析组件能完成如下的代码:

html_regular = {'Name':r'(.+?)','Work':r'(.+?)','Sex':r'(.+?)',

........}

HtmlParser(html_regular).parse(html)

上面两句代码的意思很明确:第一句代码是定义了html字符中我们待抽取的结构化数据的组织形式,即通过什么样的正则表达式去把这些数据匹配出来。第二句代码就是构造一个解析器去解析指定的html参数,输出我们想要的结构化数据.

对于比较复杂的数据结构,如List对象,嵌套对象,等等,我们也要提供支持。

list_regular = [{'groupKey':r'在html源码中分隔List数据的分隔符代码'},

{'description':r'匹配description的正则表达式','date':r'匹配date的正则表达式'}]

以上结构是抽取List重复数据时的表达式定义:List中必需有且只有两个元素,第一个'groupKey'是对当前List结构在Html源码中的分隔字符,第二个元素是List组成元素的正则表达式匹配描述。

还是以前面的Html源码举例,如果现在的Html中有多个这个的数据:

姓名:

tony1

....

....

....

姓名:

tony2

....

....

....

姓名:

tony3

....

....

....

可以看到这里的结构就是List,且有三个元素数据。所以这时的regular表达式应该这样描述:

list_regular = [{'groupKey':r'

{'Name':r'(.+?)',

...}]

以上描述完了我们希望的这个组件所具有的功能后,我们再看下具体的实现代码:

1 #encoding: utf-8

2

3 importre4

5 """

6 Translate string of html to obj by specified regular7 """

8

9 classHtmlParser():10 def __init__(self,regular):11 self.regular =regular12

13 defparse(self,html):14 returnparseNode(self.regular,html)15

16

17 defprocessReg(exp,html):18 p =re.compile(exp,re.DOTALL)19 m =p.search(html)20 ifm:21 try:22 return m.group(1).strip()23 exceptIndexError:24 pass

25

26

27

28

29 defparseNode(node,html):30 if type(node) islist:31 objList =[]32 for itemStr in getSubHtmlGenerator(node[0]['groupKey'],html):33 objList.append(parseNode(node[1],itemStr))34 returnobjList35 else:36 obj ={}37 for name,regular innode.items():38 if type(regular) isstr:39 obj[name] =processReg(regular,html)40 else:41 obj[name] =parseNode(regular,html)42 returnobj43

44

45

46 defgetSubHtmlGenerator(groupKey,html):47 whileTrue:48 start =html.find(groupKey)49 if start != -1:50 end = html[start+len(groupKey):].find(groupKey)51 if end!= -1:52 yield html[start:end + start +len(groupKey)]53 html = html[end+start+len(groupKey):]54 else:55 yieldhtml[start:]56 break

57 else:58 break

可以看到,包括注释加空行,总共58行代码,如果大家遇到过这样的需求和看过上面所写的这些,应该知道这58行代码所做的事,是不是很简单?

总结:

我写这篇文章不是说想介绍我写的这个组件,因为它都称不上一个组件,只是写了一个类,提供了一个方法。我真正的想说的是python这个语言所强在的东西,数据结构即代码,所写的,即是所表达的意思,简单清晰。

写python代码的心得体会_写python代码的一点感想相关推荐

  1. python高级语言应用心得体会_《Python基础学习心得》1.1

    以下资料,均为网络搜索而来,放在这里,供大家学习参考. 1.1.Python语言简介(摘自<Python教程>) 如果你经常在电脑上工作,总会有些任务会想让它自动化.比如,对一大堆文本文件 ...

  2. python实验总结心得体会_细探培桃法,静待李花开诺德实验学校小学部召开家访总结交流会...

    点击蓝字 关注我们 家访是一场聆听,聆听每一个孩子的心声,聆听每一个家庭的回馈:家访是一场交换,寒风中带去关爱,晚霞里带回理解:家访就是一次守望,家校共育,桃李花开.为深入推进班主任和学科教师家访工作 ...

  3. python找工作心得体会_分享给入门Python小白的学习心得

    原标题:分享给入门Python小白的学习心得 Python诞生于1989年,第一个公开版本于1991年问世.作为一门历史悠久的语言,Python具有代码简短.可读性强等先天优势.Python是一个很全 ...

  4. python实验总结心得体会_山东省实验学子在“2020未来太空学者大会中国区终选赛”中获佳绩...

    日前,"2020未来太空学者大会中国区终选赛"在北京举行,来自全国各地的近300名选手参加了此次比赛.山东省实验中学孙皓霖.林立栋.任淏璐.张明慧.刘宇哲.董晗.刘至理.刘齐一星. ...

  5. python综合实验心得体会_综合实验心得体会

    综合实验心得体会 [篇一:形态学综合实验心得体会] <形态学综合实验的学习体会> 年级 11 级学号 1130506172 姓名 高焱得分 时间总是在不经意间飞快的流逝,为期一个月的医学形 ...

  6. 用python设计数独的心得体会_使用python解数独

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  7. python编程基础的阅读心得体会_学习Python的一些心得体会(熊逸飞)

    PART 2 第一章作者没有抛出过多内容,只是简单介绍了Python作为编程语言的一些比较优势,然后介绍它的历史和创始人的故事.从90年首次发布到现在经历了十几次优化才有了如今我们使用的Python, ...

  8. mysql课设的心得体会_关于数据库课设的感想

    在昨天,11.22 我完成了这次课设的报告,开心! 这次的课设真是个磨人的小妖精!!! 题目也不是很难,数据库+窗口显示 火车票售票系统(用户+管理员 订票/退票 增删改信息等操作) 最后我决定用 s ...

  9. 新生学大学计算机心得,大学生信息技术心得体会怎么写

    [导语]在二十一世纪的今天,以计算机和网络技术为核心的现代技术正飞速的发展,越来越深刻的改变我们的学习方式.以下是无忧考网小编为大家精心整理的大学生信息技术心得体会怎么写,欢迎大家阅读,供您参考.更多 ...

最新文章

  1. Promise 化回调式函数
  2. C#实现动态编译代码
  3. Android BLE学习(一): Android搜索BLE设备
  4. Git Branch Mode(分支模式)
  5. 使用nginx为ArcGIS Server做反向代理
  6. 【转】PHP对象在内存中的分配
  7. Linux命令之---cat
  8. UE4 人物运动基本设置
  9. 无绳园林设备行业调研报告 - 市场现状分析与发展前景预测
  10. 运筹说第38期“迟到“的毕业证-趣闻轶事(三)
  11. ffmpeg命令下载MP4视频)
  12. 1135: 算菜价 C语言
  13. Python绘图实例32:矩形螺旋线绘制
  14. 拼多多API接口大全
  15. 用vuejs仿网易云音乐(实现听歌以及搜索功能)
  16. Unity中关于Destroy的API
  17. 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文但“good”不是回文,试写一个算法判断给定字符是否为回文。
  18. 新唐单片机模拟IIC
  19. Go语言进阶,结构体与json字符串格式的互相转换
  20. 最好的五款骨传导耳机推荐,双十一必入骨传导蓝牙耳机

热门文章

  1. 80-10-015-原理-Java NIO-ByteBuffer
  2. 03-NIO通讯模型
  3. 【Flink】Flink 模拟 kafka 消费重启后 能接着读取 保存状态信息
  4. 【Flink】Flink 从 1.9.1 版本 升级到 1.12.4 版本的 注意事项 以及 过程
  5. 10-20-000-简介-Thrift
  6. Java : ServiceLoader详解
  7. 95-110-022-源码-Env-LocalStreamEnvironment
  8. 95-130-348-源码-source-kafka相关-Handover
  9. 【MySQL】MySQL 8报错 Unknown initial character set index 255 received from server. Initial client char
  10. SparkSQL报错:UnresolvedException: Invalid call to dataType on unresolved object, tree: 'bb