先说一下关于筛选我用的比较多的是String的查找下标以及根据下标进行截取来达到把数据从源码中剥离出来
当然这种方法也不是很完善的我们慢慢说
话不多说直接干货
一.筛选方法
1.正则表达
2.xpath
3.还有我用的String方法
等等
正则表达比较简单明了,而且可用于多平台,多语言,但要求正则表达掌握的比较熟练.
xpath 原本是 XML 路径语言 也同样使用于HTML 文本格式,可以快速定位到指定节点位置,但我没有使用过不进行评论,可以在收到很多教程
最后就是java 自带的String 方法,将源码写入字符串中,查找指定字符串定位下标,根据下标截取数据,由于我用的比较多进行详解
二.String数据解析
先讲一下缺点吧
- 占用资源比较多,String中的数据存储在内存中,因为使用字符串存储页面源码,如果遇到特殊情况,如比较老的页面结构,广告比较多的页面结构,这都会增加源码大小,进而影响解析速度,当然有简单办法解决
- 需要写的逻辑比较多,使用查找字符串来定位数据前后下标,在使用下标截取数据,简单的html层次可能直接定位截取就可以,但复杂页面可能需要层层剥离在多次定位才能截取到
- 对新的页面需要重新写新的解析方式,这个解析方法只能做到一对一,一套方法对应一个网站
- 需要事先定位,有些数据位置需要多次测试定位到.
缺点说了一堆,但大多都是数据解析的通病,下面详细说一下我解析数据的方法
首先先说一下如果比较熟悉H5的结构对数据的解析帮助很大
页面上的数据都是将H5+css+js解析后呈现的,但源码有些就比较复杂.
我在解析的时候主要分为好几步(还没想好会有几步)
- 分析数据大致位置
- 对不需要的,可能对解析产生影响的,假的数据先进行剔除,留下含有数据的部分
- 如<ul><li>结构,数据存储在相同并重复的标签内,使用每一条数据中只出现一次的字符串进行拆分
- "洋葱"结构,从上到下每层都可能会有数据,获取一层数据删除一条数据,防止干扰
- 获取数据,将数据整理入库
三.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();替换方法,去除干扰项,前字符串为目标,后字符串为更换值,后值为""时,删除指定项
- 讲一个例子:获取ul里数据
//第一步除去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里就是包含一些标签的数据,只需要循环截取数据即可