欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

张赐荣|浅谈程序实现解析HTML的几种方式及优劣分析

时间:2023-05-18

浅谈程序实现解析HTML的几种方式及优劣分析

作者: 张赐荣
链接: https://cnblogs.com/netlog/

我们目前使用的很多忙用上网辅助软件都多多少少用到了解析网页的技术,虽然都是解析网页,但大家使用的方法肯定是各不相同的,有笨拙些的,也有高深莫测的,其实这都很正常,什么都是个循序渐进的过程,谁也都是从初学者开始的。
本文并不涉及具体某一门编程语言,因为原理都是相通的,差别可能就是每门语言的支持方式不同,比如某些语言的支持库很多,比如java python等等,有些语言相应的支持库就少些,比如很多人用的易语言。大家之所以在网上看到有人说python特别适合用来爬虫,原因就是他有很多线程好用的第三方库,只可惜的是我对Python并不是太熟悉,属于连蒙带猜能看看的那种。
既然要解析网页,那么首先大家还是要对html的基本有所了解,比如知道什么是html标签,什么是元素的属性等等,这个当然是了解的越多越好了。
接下来就由浅入深的讲讲几种我所知道的解析网页的方式。
第一种文本解析法。一般而言这应该是初学编程的开发者最先想到和用到的方法,至少我是这样的,因为他所用到的技术相对简单,也是大家最早接触的。所谓的文本解析法就是把网页看做一个大的文本,然后从中去抽取内容,用到的方法无非就是处理文本的一些函数,比如取文本中的子文本,分割文本,文本替换等等。
比如我们要获取一本小说的张杰,那么先找到分割点,把每个张杰分隔开,然后 在用取每个分割点的子文本函数获取张杰标题和链接地址就可以了,要获取张杰正文就是找一个开始点和结束点然后把中间的内容取出来然后把不相干的内容替换掉就可以了。
这种方法的优点在于简单易学,大家对于网页结构有个基础的了解就可以,甚至对网页一无所知也能做一定的解析。另外他的执行效率很高。
他的缺点在于相对笨拙,会让一些看似水平高的人笑话你用的技术低级,当然如果真有这样的人,请相信用不了多久你就能超越他,因为他就是个半吊子,他现在比你知道的多只不过他比你接触的早,但仅此而已,因为他并不知道很多的网页解析的框架底层都多多少少会用到文本解析的方式。
其次他的灵活性相对欠缺,对于有些相对复杂的网页和一些特殊的需求会有些力不从心,在写代码的时候也相对繁琐,代码量也叫多。
第二种方法正则表达式。正则表达式是处理文本的利器,解析网页当然也不在话下了,当然要使用他的前提就是会用正则表达式了。
还是拿刚才的例子说,比如我们要获取一本小说的张杰那么只需要写一段匹配张杰的正则即可,把标题和链接加入补货组然后取出来就可以了,获取张杰正文也是同样的道理。
正则解析的优点在于非常灵活,基本能够处理所有的需求。
他的缺点在于有一定的学习成本,另外他的执行效率受开发者的技术影响很大,也就是说同样都能获取相关的内容,但不同的正则表达式的执行效率相差很大,即使你优化的很好他的执行效率比起文本解析还是不如的,消耗的资源也相对更大,不过这些不那么重要,用的时候还得继续用,一般情况下大家体会的不会那么明显。
然后正则的出错几率相对较高,排查起来相对麻烦,这里要特别强调的一点就是正则也并不是万能的,比如对于多层嵌套的网页他就会有些束手无策,当然在后来引入了平衡组的概念比较优雅的解决了这个问题,但是支持这个特性的语言目前非常的少。
第三种方法html dom解析。这应该是目前解析html最优雅的方式了,因为不同于上面两种,顾名思义html dom本身就是为了处理html而生的。同样的,如果想用此技术,那么对于html本身不能像之前那样有简单的了解就可以了,得有一定深入的了解才能用的顺手。
由于现在很多的dom解析库都用到了css的选择器语法,所以大家要对css元素筛选方式也要熟悉。
我们还是拿刚才的例子来说,如果我们要获取小说的张杰列表,那么用dom解析的思路就是首先要了解每个张杰的特征,一般是class冥或者标签本身来抽取,比如此站点每个张杰链接的class名字都是chapter,那么我们就可以用相应的语法去获取所有的class名字的集合,然后在获取他们的href和title或者innerhtml属性就可以了,获取正文也是同样的道理,只不过可能把原先的用class冥改成用元素id获取。
html dom解析的优点在于会了使用非常方便,代码优雅,他是解析html的原生方式。同时他还具备了其他方法不具备或者非常繁琐的功能,就是可以非常容易的操作html的所有内容,比如添加元素,删除元素等,而不仅仅是获取内容。
他的缺点也非常明显,就是对于开发者的综合素质要求相对比较高一些,开发者需要掌握多方面的知识才能把他婉转。另外他这种方式一般都要依赖第三方库的支持,第三方库的质量水准决定了解析的执行效率,而且每门语言所能用的解析框架数目也各不相同,使用方法也各有差异,质量也参差不齐,比如python、java和.NET就有很多非常好用 的库,而易语言几乎没有,可能只能通过windows系统自带的js对象库去变相的对其进行操作了。
以上就是我目前所知道的解析网页的技术了,可能还有其他的方式就等大家补充了,这里要说的是尤其是第三种方法可能每个框架的使用方式不同,比如有些用css语法,有些用原生java语法,有些用自己的语法,但其核心是不变的,所以并不是多出了方法。
希望文章对大家有所帮助。

参考:
[1] 正则表达式快速入门教程: http://www.zd.hk/thread-108013.htm
[2] C#.NET 中的正则表达式: https://zhuanlan.zhihu.com/p/464863990?

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。