先說一下關於篩選我用的比較多的是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裏就是包含一些標籤的數據,只需要循環截取數據即可