先说一下关于筛选我用的比较多的是String的查找下标以及根据下标进行截取来达到把数据从源码中剥离出来
当然这种方法也不是很完善的我们慢慢说
话不多说直接干货
筛选方法
String数据解析
String方法实例
一.筛选方法
1.正则表达
2.xpath
3.还有我用的String方法
等等
正则表达比较简单明了,而且可用于多平台,多语言,但要求正则表达掌握的比较熟练.
xpath 原本是 XML 路径语言 也同样使用于HTML 文本格式,可以快速定位到指定节点位置,但我没有使用过不进行评论,可以在收到很多教程
最后就是java 自带的String 方法,将源码写入字符串中,查找指定字符串定位下标,根据下标截取数据,由于我用的比较多进行详解
二.String数据解析
先讲一下缺点吧
- 占用资源比较多,String中的数据存储在内存中,因为使用字符串存储页面源码,如果遇到特殊情况,如比较老的页面结构,广告比较多的页面结构,这都会增加源码大小,进而影响解析速度,当然有简单办法解决
- 需要写的逻辑比较多,使用查找字符串来定位数据前后下标,在使用下标截取数据,简单的html层次可能直接定位截取就可以,但复杂页面可能需要层层剥离在多次定位才能截取到
- 对新的页面需要重新写新的解析方式,这个解析方法只能做到一对一,一套方法对应一个网站
- 需要事先定位,有些数据位置需要多次测试定位到.
缺点说了一堆,但大多都是数据解析的通病,下面详细说一下我解析数据的方法
首先先说一下如果比较熟悉H5的结构对数据的解析帮助很大
页面上的数据都是将H5+css+js解析后呈现的,但源码有些就比较复杂.
我在解析的时候主要分为好几步(还没想好会有几步)
三.String方法实例
HTML源码
<!doctype html> <html data-path="/newsflashes"> <head> <meta charset="UTF-8"> <meta name="xxxxx" content="xxxxx"> <title data-react-helmet="true">xxxx</title> <link href="xxxxxx" rel="xxxxx" type="xxxxx"> <script></script> </head> <body> <div class="code"> <div class="code-img"></div> <div class="code-content"> <div class="tabs"> <ul class="business-line"> <li><a href="https://mp.csdn.net">数据1</a></li> <li><a href="https://mp.csdn.net">数据2</a></li> <li><a href="https://mp.csdn.net">数据3</a></li> <li><a href="https://mp.csdn.net">数据4</a></li> <li><a href="https://mp.csdn.net">数据5</a></li> <li><a href="https://mp.csdn.net">数据6</a></li> </ul> <ul class="business-line"> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> <li><a href=""></a></li> </ul> </div> </div> </div> </div> <div class="code"> <div class="kr-header-passport" style="display:inline-block"> <a class="login"><span>数据1</span></a> <a class="line">数据2</a> <a class="resgister"><span>数据3</span></a> </div> <div class="code-img"></div> <div class="share-code">数据4</div> <div class="code-content"> <div class="tabs"> <div class="kr-white-space" style="height:40px;width:100%;"></div> <div class="kr-white-space" style="height:40px;width:100%;"></div> </div> </div> </div> </div> </body>
可以用这个源码作为例子模拟实现一下
和上一篇讲的一样主要用到几个方法
.indexOf();//从前往后查找指定字符串,返回下标
.lastIndexOf();//从后往前查找字符串,返回下标
.substring();根据两个下标,获取两个下标之间的字符串(如果下标长度长与字符串长度,报错,前下标大于后下标,报错)
.split() 将字符串拆分为数组,注意次方法可以写正则表达,可能会有干扰,但注意特殊字符需要转移
.replace();替换方法,去除干扰项,前字符串为目标,后字符串为更换值,后值为""时,删除指定项
//第一步除去head无用数据 text = H5源码 beginIndex = text.indexOf("<body>"); text = text.substring(0, endIndex);
//第二部获取含有数据区域 beginIndex = text.indexOf("<div class="code">"); endIndex = text.lastIndexOf("<div class="code">"); text = text.substring(beginIndex, endIndex);
String [] ArrayList = text.split("<li>"); // List<String> liat = new ArrayList<String>(); for(String array : ArrayList){ //判断是否为含有数据的标签 if(array.indexOf("<a") > 0 ){ liat.add(array); } } //最后list里就是包含一些标签的数据,只需要循环截取数据即可
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试