成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS抓取HTML ,CSS XPath解析數據

移動開發 iOS
以前我們獲取數據的方式都是使用 AFN 來 Get JSON 數據,比如 點我查看 JSON 數據.http://news-at.zhihu.com/api/4/news/latest,但例如下面的百度貼吧,和豆瓣讀書等網站...并不提供我們獲取數據的 API,這時我們可以解析他們的 HTML 來獲取我們想要的數據。

以前我們獲取數據的方式都是使用 AFN 來 Get JSON 數據,比如 點我查看 JSON 數據.http://news-at.zhihu.com/api/4/news/latest

但例如下面的百度貼吧,和豆瓣讀書等網站...并不提供我們獲取數據的 API

百度貼吧:   

百度貼吧數據 

百度貼吧數據.png

豆瓣讀書: 

豆瓣讀書數據 

豆瓣讀書數據.png

這時我們可以解析他們的 HTML 來獲取我們想要的數據.

工具準備

這時我們需要2個工具,Firefox 和FireBug.

你可以在 http://www.firefox.com.cn/download/下載 FireFox 瀏覽器,然后在其右上角菜單的附加組件管理器中下載 FireBug 插件.

FireBug 有很強大的 JavaScript 調試功能,還能實時編輯 HTML CSS,是前端同學喜愛的一個工具.

下載安裝好以后 點擊右上角的 Bug(蟲子)圖標來使用 FireBug 調試當前網頁.

如果你不了解 XPath ,可以學習 w3school 的教程. 

 

 

打開 FireBug 

打開 FireBug.png

Ono 開源庫

Ono 是一個 Github 上的開源項目,它能方便我們解析 XML,HTML 標簽,并且支持 CSS XPath 搜索特定節點.

你可能沒聽過這個庫,但其作者你肯定知道. Mattt Thompson,它是 AFN 的作者,還是博客 NSHipster 的作者.

Swift 版本類似的開源庫 Ji

Java 或 Android 可以使用 Jsoup

開始

準備工作都 Ok 了..我們開始編碼.新建一個空白工程,注意,如果要在 Info.plist 中添加兩行 App Transport Security Settings,和 Allow Arbitrary Loads YES, 來允許 HTTP 傳輸.   

App 允許 Http 

App 允許 Http.png

然后使用 CocoaPods 添加第三方庫 pod 'Ono'.

這里,要解析的 HTMl 數據就用我的博客了

再創建一個 Post 類繼承自 NSObject,代表每一篇文章 ,修改 .h 文件如下

  1. #import 
  2.  
  3. @class ONOXMLElement; 
  4.  
  5.   
  6.  
  7. @interface Post : NSObject 
  8.  
  9. @property (copy,nonatomic) NSString *title; //文章標題 
  10.  
  11. @property (copy,nonatomic) NSString *postDate; //文章發表時間 
  12.  
  13. @property (copy,nonatomic) NSString *postUrl; //文章正文內容的 Url 
  14.  
  15.   
  16.  
  17. +(NSArray*)getNewPosts; //獲取所有文章 
  18.  
  19. +(instancetype)postWithHtmlStr:(ONOXMLElement*)element; //用 HTMl 數據創建 Post 類 
  20.  
  21. @end  

在.m 文件中導入 Ono,并添加一個常量 Url.

  1. #import      
  2.  
  3. static NSString *const kUrlStr=@"http://BigPi.me" 

然后我們可以用 AFN 等下載該 Url 的 HTML數據,再使用 XPath 獲取代表每一篇文章的 XPath,

先打開 FireFox 和 FireBug ,點擊下面的圖 

 

 

FireBug 元素選擇器 

FireBug 元素選擇器.png

在適當移動鼠標,點擊選擇網頁上的一篇文章, 

 

 

Post數據 

Post數據.png

這時我們可以看到,下面 FireBug 的 HTMl 樹展開了,我們可以發現,每一個

標簽都包含一篇文章的數據.

我們右鍵

,復制其 XPath 

 

 

復制 XPath 

復制 XPath.png

復制出來的結果 //*[@id="posts"],這個

節點下面的每一個子節點都代表一篇文章,

我們現在來使用這個 XPath 獲取所有的 HTML 數據.在 Post.m 添加如下方法:

  1. +(NSArray*)getNewPosts{ 
  2.  
  3.     NSMutableArray *array=[NSMutableArray array]; 
  4.  
  5.     NSData *data= [NSData dataWithContentsOfURL:[NSURL URLWithString:kUrlStr]]; //下載網頁數據 
  6.  
  7.   
  8.  
  9.     NSError *error; 
  10.  
  11.     ONOXMLDocument *doc=[ONOXMLDocument HTMLDocumentWithData:data error:&error]; 
  12.  
  13.     ONOXMLElement *postsParentElement= [doc firstChildWithXPath:@"//*[@id='posts']"]; //尋找該 XPath 代表的 HTML 節點, 
  14.  
  15.     //遍歷其子節點, 
  16.  
  17.     [postsParentElement.children enumerateObjectsUsingBlock:^(ONOXMLElement *element, NSUInteger idx, BOOL * _Nonnull stop) { 
  18.  
  19.         NSLog(@"%@",element); 
  20.  
  21.     }]; 
  22.  
  23.     return array; 
  24.  
  25.  

并在ViewController.m 中調用這個方法:

  1. @implementation ViewController 
  2.  
  3.   
  4.  
  5. - (void)viewDidLoad { 
  6.  
  7.     [super viewDidLoad]; 
  8.  
  9.     [Post getNewPosts]; 
  10.  
  11.  
  12.   
  13.  
  14. @end  

運行后查看 Console, 我們已經可以獲取到每篇文章的 HTMl 了,然后我們再來解析每篇文章的具體數據.

切換到 FireBug,展開其中一篇文章的節點   

 

文章 HTML 節點.png

我們可以看到<h2 class="title">節點下的

  • <a href="/post/jazzhands/jazzhands-yuan-ma-shi-xian-fen-xi">
  • <i class="fa fa-leaf"></i>
  • JazzHands 源碼實現分析</a>

標簽中,有文章的具體Url, 和文章標題,

<div class="info">節點下的,

  • <span class="date">
  • <i class="fa fa-clock-o"></i>
  • 2016-03-04 21:39</span>

標簽有文章發布的時間,此時我們可以右鍵點擊節點,復制文章標題,發布時間等節點的 XPath,

但這里我們使用相對的 XPath.

每篇文章的 HTML 結構如下:

  • 文章標題 Url等內容

所以我們的

  • 文章 Url XPath : “h2/a”
  • 文章標題 XPath : a 標簽的 href 屬性值
  • 文章發布時間 XPath : “div[2]/span[1]”

接下來我們來解析每一篇文章的詳細數據

在 Post.m 中添加方法:

  1. +(instancetype)postWithHtmlStr:(ONOXMLElement*)element{ 
  2.  
  3.   
  4.  
  5.     Post *p=[Post new]; 
  6.  
  7.     ONOXMLElement *titleElement= [element firstChildWithXPath:@"h2/a"]; // 根據 XPath 獲取含有文章標題的 a 標簽 
  8.  
  9.     p.postUrl= [titleElement valueForAttribute:@"href"]; //獲取 a 標簽的  href 屬性 
  10.  
  11.     p.title= [titleElement stringValue]; 
  12.  
  13.     ONOXMLElement *dateElement= [element firstChildWithXPath:@"div[2]/span[1]"]; //根據 XPath 獲取文章發布時間 span 標簽 
  14.  
  15.     p.postDate= [dateElement stringValue]; 
  16.  
  17.     return p; 
  18.  
  19.  

然后修改 +(NSArray*)getNewPosts方法:如下

  1. ... 
  2.  
  3. [postsParentElement.children enumerateObjectsUsingBlock:^(ONOXMLElement *element, NSUInteger idx, BOOL * _Nonnull stop) { 
  4.  
  5.         //NSLog(@"%@",element); 
  6.  
  7.         Post *post=[Post postWithHtmlStr:element]; 
  8.  
  9.         if(post){ 
  10.  
  11.             [array addObject:post]; 
  12.  
  13.         } 
  14.  
  15.     }]; 
  16.  
  17. ...  

最后因為我們我們獲取到的 HTMl 的文章 Url 是相對 Url, 類似

/post/jazzhands/jazzhands-yuan-ma-shi-xian-fen-xi

所以我們在 Setter 方法中拼接域名 , http://BigPi.me

  1. -(void)setPostUrl:(NSString *)postUrl{ 
  2.  
  3.     _postUrl=[kUrlStr stringByAppendingString:postUrl]; 
  4.  
  5.  

我們在下圖位置打斷點查看結果: 

代碼斷點

 代碼斷點.png

運行起來,結果如下: 

 

 

抓取文章數據結果 

抓取文章數據結果.png

至此我們已經能使用 FireBug + Ono + XPath 來解析 HTML 數據

我就使用這個辦法獲取我們學校教務管理系統 HTML,制作了一個統計成績,計算績點的 App.

補充

  • FireBug 是一個很強大前端調試工具.
  • 還可以使用 正則表達式 來解析 HTML 數據.不過從 StackOverflow 討論 來看 ,并推薦使用正則來解析 HTML 數據.
  • RayWonderLich 有一篇比較老的教程 ,使用類似的技術解析 HTML
  • 最最后,很重要的一點,HTML 數據可能經常會變動,尤其那個網頁還不是我們自己能管理的網頁,所以 XPath 隨時可能解析失敗,
  • 如果你一定要使用 XPath 來解析 HTML 數據,可以在服務端進行這個操作,然后修改成 API 的形式,讓手機端像以前一樣 GET JSON 數據.
  • 同時,服務端還可以設置異常處理,緩存等策略.

本文 Demo 可以在 https://github.com/iShawnWang/BlogDemo/tree/master/ParseHTMLDemo中獲取

責任編輯:龐桂玉 來源: iOS大全
相關推薦

2023-12-29 08:24:50

.NETHTML解析庫數據抓取

2014-02-19 09:59:52

iOS開發Html解析

2023-01-28 08:00:00

PythonHTML表格數據

2021-01-12 05:03:15

PythonLxmlXpath

2016-09-29 15:19:04

HTMLCSSWeb

2020-08-24 14:21:27

app爬蟲Python

2013-03-27 12:54:00

iOS開發Objective-C

2010-08-27 15:16:26

htmlbodyCSS

2010-09-13 09:35:28

DIVCSS

2013-09-16 10:19:08

htmlcssJavaScript

2011-08-22 16:08:46

IOS開發數據庫

2010-07-16 11:16:40

Perl抓取網頁

2021-10-23 06:42:46

Node.js 抓取堆快照.js

2021-07-07 08:01:48

CSS DOM解析

2010-08-30 15:26:13

floatCSS

2010-09-16 10:04:50

CSSdisplay:tab

2010-08-20 14:58:26

CSSpadding

2010-08-24 11:25:06

DIVCSS

2010-09-03 10:31:31

CSSmargin

2010-09-07 10:07:40

CSS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品日韩欧美一区二区三区 | 欧美一区视频 | 久久精品欧美一区二区三区不卡 | 国产重口老太伦 | 欧产日产国产精品视频 | 久久精品成人 | 人人看人人爽 | 中日av | 手机三级电影 | 插插宗合网 | 久一精品 | 精品三级在线观看 | 久久亚洲一区二区三区四区 | aa级毛片毛片免费观看久 | 欧美精品一区二区三区四区五区 | 国产精品一区二区福利视频 | 黑色丝袜三级在线播放 | 一区二区不卡视频 | 日韩小视频 | 成人国产精品免费观看视频 | 亚洲视频免费在线观看 | 国产在线观看网站 | 日本网站免费观看 | 黄色毛片一级 | 亚洲视频 欧美视频 | 欧洲精品久久久久毛片完整版 | 一区精品视频在线观看 | 午夜免费视频观看 | 精品福利在线 | 激情欧美一区二区三区中文字幕 | 91伦理片 | 黄色男女网站 | 欧美中文字幕一区二区三区亚洲 | 午夜丰满寂寞少妇精品 | 午夜免费av | 欧美在线| 久久国产成人 | 在线色| 岛国av免费观看 | 色婷婷综合久久久中字幕精品久久 | 午夜视频一区二区三区 |