首先感謝博友對這個系列的支持,不少加羣的人都問我啥時候更新,我一直回答儘快,結果一拖就一年了。由於工做和生活佔據我大量的時間,因此只能跟大夥說聲抱歉。javascript
前兩篇講到如何採集html數據,那採集回來確定要截取咱們有用的部分,舉個例子。咱們要採集搜狐新聞的社會欄目,地址以下:php
http://news.sohu.com/shehuixinwen.shtmlcss
咱們首先獲取到新聞列表,看上兩章介紹到使用xNet獲取到搜狐新聞的社會欄目的html源碼,固然你可使用httprequest或者第三方組件。代碼以下:html
var html = string.Empty; using (var request = new xNet.HttpRequest()) { html = request.Get("http://news.sohu.com/shehuixinwen.shtml").ToString(); }
獲得html值:java
<!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/ xhtml1-transitional.dtd"> <script type="text/javascript"> var pvinsight_page_ancestors = '143746642;143746651'; </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=gb2312" /> <title>社會新聞-搜狐新聞</title> <script type="text/javascript" src="http://www.sohu.com/sohuflash_1.js"></script> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> <meta name="description" content="搜狐社會新聞關注社會民生、百姓問題。精品欄目:社會萬象、百姓生活" /> <meta name="keywords" content="社會,社會新聞,萬象,百姓,口述" /> <meta name="robots" content="all" /> <link type="text/css" rel="stylesheet" href="http://css.sohu.com/upload/global1.4.1.css" /> <link rel="stylesheet" href="http://news.sohu.com/upload/zhengyufeng/xinwenerjiye/style1.css" /> <script type="text/javascript" src="http://js.sohu.com/library/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="http://news.sohu.com/upload/2013page/j.js"></script> <!--[if IE 6]> <script src="http://news.sohu.com/upload/zhengyufeng/pngAlaph.js"></script> <script>DD_belatedPNG.fix('#header,h3,h3 span,.shipin,.dashiye_list li,.liushengji_list li,#imgText b,img,.followScroll a,#contentA .left .tit span'); </script> <![endif]--> ..... <script language="javascript"> if(_wratingId !=null){ document.write('<scr'+'ipt type="text/javascript">'); document.write('var vjAcc="'+_wratingId+'";'); document.write('var wrUrl="http://sohu.wrating.com/";'); document.write('try{vjTrack();}catch(e){}'); document.write('</scr'+'ipt>'); } </script> <script> require(["sjs/matrix/ad/passion"]);</script> <!--SOHU:SUB_FOOT_DIV--> </body> </html>
由於html比較大,因此不顯示所有,爲了防止搜狐改版,我仍是截取一段樣板jquery
<div class="article-list"> <div class="article"> <h3><span class="com-num"><a target="_blank" href="#">comment num</a></span><a target="_blank" href="http://www.sohu.com/a/190778382_119562">「五假副部」現形始末:被指講話稿都念不順</a></h3> <p>...<a target="_blank" href="http://www.sohu.com/a/190778382_119562">閱讀全文>></a></p> </div> <div class="pic-group"> </div> <div class="fun clear"> <div class="share"> <ul> <li class="s-t">分享到 |</li> <li class="blg"><a title="·??í?????ü????" href="javascript:void(0)"></a></li> <li class="qq"><a title="·??í??QQ????" href="javascript:void(0)"></a></li> <li class="rrw"><a title="·??í????????" href="javascript:void(0)"></a></li> <li class="db"><a title="·??í????°ê" href="javascript:void(0)"></a></li> <li class="itb"><a title="·??í??i?ù°?" href="javascript:void(0)"></a></li> </ul> </div> <!-- <div class="label">±ê????<a target="_blank" href="#">??????</a> <a target="_blank" href="#">???ú</a> <a target="_blank" href="#">????</a></div> --> <div class="time"> 發表於 2017-09-09 13:03</div> </div> </div>
那咱們要獲取新聞列表的標題和鏈接地址怎麼獲取了? 那麼就要介紹本篇的核心,使用正則,一講到正則不少人會以爲很難,由於寫法比較火星語。第二就是測試正則,市面上有不少測試工具,包括在線的都有,看你的喜愛了,這裏我要介紹一個超級無敵好用的測試工具,你們能夠去網上下載或者在本文最後的會有下載連接,這個工具名叫:RegExBuilder 爲啥說他好用,主要是他採用即時匹配,這樣對新手能夠一步步的調試編寫正則。使用上面的工具能夠獲得如下正則匹配新聞列表和鏈接地址代碼:機器學習
<h3>[^>]*>[^>]*>[^>]*>[^>]*><a.target="_blank"\shref="(?<url>[^"]*)[^>]*>(?<title>[^<]*)
寫得比較粗獷,估計一百我的有一百個寫法,因此這也是正則有魔力的地方,入門難,入門後小菜一碟。這裏要說明一下,(?<title>[^<]*)是能夠經過 title 這個關鍵字獲取值,後面代碼會寫到。但在javascript、java、php等是按索引獲取的,因此C#仍是比較人性化滴工具
使用代碼獲取咱們要的數據,首先得定義一個新聞類:學習
class NewsItem { public string Title { get; set; } public string Url { get; set; } public string Content { get; set; } }
邏輯代碼測試
var html = string.Empty; using (var request = new xNet.HttpRequest()) { html = request.Get("http://news.sohu.com/shehuixinwen.shtml").ToString(); } var newsList = new List<NewsItem>(); var mc = Regex.Matches(html, @"<h3>[^>]*>[^>]*>[^>]*>[^>]*><a.target=""_blank""\shref=""(?<url>[^""]*)[^>]*>(?<title>[^<]*)"); foreach (Match m in mc) { var newsItem = new NewsItem(); newsItem.Title = m.Groups["title"].Value; newsItem.Url= m.Groups["url"].Value; //按索引獲取,具體看RegExBuilder工具的索引 newsItem.Url = m.Groups[1].Value; newsItem.Title = m.Groups[2].Value;
newsList.Add(newsItem); }
注意轉譯字符串哦,不是兩個正則不同,而後就能夠獲得整個新聞的列表,有人會提問,那下一頁呢?嘿嘿...車只能開到這了。
獲取新聞內容,拿到地址後,能夠用xNet獲取html源碼,而後分析,示例以下:
先用RegExBuilder編寫正則代碼,獲得:
<article\sclass="article">(?<content>.+?)</article>
這裏要勾選Singleline選項,Singleline顧名思義就是所有按單行匹配,就是有換行也按單行,還有其餘幾種匹配模式,其實均可以按字面意思去理解。譬如:
IgnoreCase:忽略大小寫
Multiline:多行匹配
RightToLeft:從右到左匹配
其餘能夠參考這位道友的文章,http://blog.csdn.net/qq_33729889/article/details/63035440
獲取數據的邏輯代碼
foreach (var newItem in newsList) { using (var request = new xNet.HttpRequest()) { html = request.Get(newItem.Url).ToString(); } Match m = Regex.Match(html, @"<article\sclass=""article"">(?<content>.+?)</article>", RegexOptions.Singleline); if (m.Success) { newItem.Content = m.Groups["content"].Value; } }
以上就是簡單使用正則獲取html數據的案例。
其實會使用一些簡單的東西基本上就能知足咱們的開發需求
譬如:<div>數據</div>
最簡單的寫法:<div>(\w+)</div> 括號是你要取的數據\w是匹配全部的字符,+是表明一個以上,若是使用*就是包含零個字符
進階一點的寫法:<[^>]*>(\w+)</div> [^>]*是若是非>則一直匹配
更多的正則教程能夠參考http://www.cnblogs.com/zery/p/3438845.html
附上正則匹配小工具下載地址:
http://www.jb51.net/softs/389196.html
開源Q羣:302961959
足球研究技術羣:142780296