精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS抓取HTML ,CSS XPath解析數(shù)據(jù)

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

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

但例如下面的百度貼吧,和豆瓣讀書等網(wǎng)站...并不提供我們獲取數(shù)據(jù)的 API

百度貼吧:   

百度貼吧數(shù)據(jù) 

百度貼吧數(shù)據(jù).png

豆瓣讀書: 

豆瓣讀書數(shù)據(jù) 

豆瓣讀書數(shù)據(jù).png

這時我們可以解析他們的 HTML 來獲取我們想要的數(shù)據(jù).

工具準備

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

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

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

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

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

 

 

打開 FireBug 

打開 FireBug.png

Ono 開源庫

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

你可能沒聽過這個庫,但其作者你肯定知道. 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 數(shù)據(jù)就用我的博客了

再創(chuàng)建一個 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; //文章發(fā)表時間 
  12.  
  13. @property (copy,nonatomic) NSString *postUrl; //文章正文內(nèi)容的 Url 
  14.  
  15.   
  16.  
  17. +(NSArray*)getNewPosts; //獲取所有文章 
  18.  
  19. +(instancetype)postWithHtmlStr:(ONOXMLElement*)element; //用 HTMl 數(shù)據(jù)創(chuàng)建 Post 類 
  20.  
  21. @end  

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

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

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

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

 

 

FireBug 元素選擇器 

FireBug 元素選擇器.png

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

 

 

Post數(shù)據(jù) 

Post數(shù)據(jù).png

這時我們可以看到,下面 FireBug 的 HTMl 樹展開了,我們可以發(fā)現(xiàn),每一個

標簽都包含一篇文章的數(shù)據(jù).

我們右鍵

,復制其 XPath 

 

 

復制 XPath 

復制 XPath.png

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

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

我們現(xiàn)在來使用這個 XPath 獲取所有的 HTML 數(shù)據(jù).在 Post.m 添加如下方法:

  1. +(NSArray*)getNewPosts{ 
  2.  
  3.     NSMutableArray *array=[NSMutableArray array]; 
  4.  
  5.     NSData *data= [NSData dataWithContentsOfURL:[NSURL URLWithString:kUrlStr]]; //下載網(wǎng)頁數(shù)據(jù) 
  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 節(jié)點, 
  14.  
  15.     //遍歷其子節(jié)點, 
  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 中調(diào)用這個方法:

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

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

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

 

文章 HTML 節(jié)點.png

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

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

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

<div class="info">節(jié)點下的,

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

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

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

每篇文章的 HTML 結(jié)構(gòu)如下:

  • 文章標題 Url等內(nèi)容

所以我們的

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

接下來我們來解析每一篇文章的詳細數(shù)據(jù)

在 Post.m 中添加方法:

  1. +(instancetype)postWithHtmlStr:(ONOXMLElement*)element{ 
  2.  
  3.   
  4.  
  5.     Post *p=[Post new]; 
  6.  
  7.     ONOXMLElement *titleElement= [element firstChildWithXPath:@"h2/a"]; // 根據(jù) 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]"]; //根據(jù) XPath 獲取文章發(fā)布時間 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.  

我們在下圖位置打斷點查看結(jié)果: 

代碼斷點

 代碼斷點.png

運行起來,結(jié)果如下: 

 

 

抓取文章數(shù)據(jù)結(jié)果 

抓取文章數(shù)據(jù)結(jié)果.png

至此我們已經(jīng)能使用 FireBug + Ono + XPath 來解析 HTML 數(shù)據(jù)

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

補充

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

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

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

2023-12-29 08:24:50

.NETHTML解析庫數(shù)據(jù)抓取

2014-02-19 09:59:52

iOS開發(fā)Html解析

2023-01-28 08:00:00

PythonHTML表格數(shù)據(jù)

2021-01-12 05:03:15

PythonLxmlXpath

2016-09-29 15:19:04

HTMLCSSWeb

2020-08-24 14:21:27

app爬蟲Python

2013-09-16 10:19:08

htmlcssJavaScript

2010-09-13 09:35:28

DIVCSS

2013-03-27 12:54:00

iOS開發(fā)Objective-C

2010-08-27 15:16:26

htmlbodyCSS

2011-08-22 16:08:46

IOS開發(fā)數(shù)據(jù)庫

2021-10-23 06:42:46

Node.js 抓取堆快照.js

2010-07-16 11:16:40

Perl抓取網(wǎng)頁

2017-12-07 16:08:47

數(shù)據(jù)優(yōu)化HTML字符串

2010-09-07 10:07:40

CSS

2010-08-24 11:25:06

DIVCSS

2010-08-20 14:58:26

CSSpadding

2010-09-03 10:31:31

CSSmargin

2010-09-14 16:04:40

CSSclip屬性

2021-07-07 08:01:48

CSS DOM解析
點贊
收藏

51CTO技術(shù)棧公眾號

国内精品一区二区三区四区| 超级碰碰久久| 久久porn| 国产精品无遮挡| 欧美大片网站在线观看 | 欧美日韩影视| 久久精品国产福利| 91性感美女视频| 久久久久久久999精品视频| 亚洲欧美在线精品| 国产精品成人国产乱| 国产91欧美| 国产欧美精品一区二区三区四区| 午夜精品一区二区三区在线视 | 欧美日韩精品免费观看视欧美高清免费大片| 国产精品一区二区你懂的| 中文字幕国产亚洲2019| 欧美少妇性生活视频| 日韩av成人| 国产精品试看| 亚洲精品xxx| 蜜桃视频一区二区在线观看| 99在线精品视频免费观看20| 我不卡伦不卡影院| 欧美一区二视频| 玖玖精品在线视频| 99久久国产免费| 女主播福利一区| 日韩你懂的电影在线观看| www国产无套内射com| 国产视频网站在线| 免费人成网站在线观看欧美高清| 亚洲午夜av久久乱码| 日韩av资源在线| 深夜福利视频在线观看| 国产精品一区在线观看乱码 | 99亚偷拍自图区亚洲| 欧美国产日韩一区| 91n在线视频| 国产高清亚洲| 亚洲一区影音先锋| 精品蜜桃传媒| 亚洲大片免费观看| 四季av一区二区凹凸精品| 欧美精品黑人性xxxx| 麻豆一区二区三区在线观看| 亚洲精品国产精品国| 夜久久久久久| 一区二区欧美日韩视频| 亚洲一二区在线观看| 黄网在线免费看| 久久久久久久久久看片| 成人av.网址在线网站| 久久久全国免费视频| 亚洲福利天堂| 欧美久久一二三四区| 97成人在线免费视频| 蜜臀久久99精品久久久| 日韩激情视频网站| 欧美猛交免费看| 中文字幕在线1| 精品一区二区三区中文字幕| 福利一区福利二区微拍刺激| 亚洲国产一区在线| 国产 日韩 欧美 精品| 午夜在线一区二区| 久久精品国产69国产精品亚洲| 永久免费未满蜜桃| 69堂免费精品视频在线播放| 色婷婷久久99综合精品jk白丝| 在线观看成人免费| 制服丝袜中文字幕在线| 国产视频一区二区在线观看| 95av在线视频| 免费的毛片视频| 午夜日韩福利| 欧美日韩成人精品| 人人干人人干人人干| 日韩电影在线视频| 精品国产免费一区二区三区香蕉| 冲田杏梨av在线| av资源中文在线天堂| 日韩久久一区二区| 久久精品人成| 亚洲毛片在线播放| 99久久伊人网影院| 欧洲av一区| 性xxxxbbbb| 成人综合在线观看| 91免费欧美精品| 日韩久久久久久久久久| 国产精品久久久一区二区| 国产成人精品999| 国产精品免费av一区二区| 国产日韩1区| 国产精品亚洲第一区| av大片在线免费观看| 亚洲午夜视频| 欧美成人午夜激情| 黑人操日本美女| 亚洲激情综合| 久久免费精品日本久久中文字幕| 日本视频在线观看免费| 久久99国产精品久久| 国产精品吹潮在线观看| 黄色在线免费观看| 国精产品一区一区三区mba桃花 | 日本少妇精品亚洲第一区| 欧美中文字幕一区二区三区| 国产91在线视频观看| 国产丝袜在线观看视频| 欧美伊人久久久久久久久影院| 男人的天堂99| 国产精品亚洲欧美日韩一区在线| 日韩久久免费视频| 成人精品在线观看视频| 乱亲女h秽乱长久久久| 色偷偷av一区二区三区乱| 日韩免费成人av| jlzzjlzz亚洲女人| 伊人精品在线观看| 国产精品第一页在线观看| 久久国产日韩欧美精品| 成人两性免费视频| 国产在线一二三区| 中文字幕免费一区| 精品国产一区三区| 日韩成人精品| www国产亚洲精品久久网站| 艳妇荡乳欲伦69影片| 婷婷久久国产对白刺激五月99| 日本韩国在线不卡| 中文字幕在线播放不卡| 久久99精品国产麻豆婷婷洗澡| 九九热久久66| 538在线视频| 日韩一级成人av| 国产视频久久久久久| 亚洲三级精品| 91精品国产高清久久久久久91| 伦av综合一区| 99国产欧美久久久精品| 日韩欧美电影一区二区| 免费人成在线观看播放视频| 一区二区三区精品视频在线| 日韩五码在线观看| 午夜欧美巨大性欧美巨大 | 国产精品无码AV| 国产乱国产乱300精品| 亚洲欧美99| 精品久久福利| 久久精品91久久香蕉加勒比| 国产一区二区三区三州| 本田岬高潮一区二区三区| 欧美人与物videos另类| 毛片在线播放a| 欧美精品一级二级三级| 动漫性做爰视频| 母乳一区在线观看| 亚洲一区二区三区久久| 国产三级在线播放| 色国产综合视频| www日本在线观看| 欧美中文一区二区| 久久久久日韩精品久久久男男| 草草视频在线播放| 国产精品丝袜一区| 国内国产精品天干天干| 日本午夜精品久久久| 久久久成人精品视频| 国产精品久久久久久免费播放| 亚洲欧美另类小说| 熟妇人妻va精品中文字幕| 精品盗摄女厕tp美女嘘嘘| 国产精品亚洲激情| 中文在线观看免费| 日韩第一页在线| 青青草免费av| 亚洲欧美视频一区二区三区| 久热这里只精品99re8久| 视频在线这里都是精品| 欧美日韩黄视频| 国产麻豆天美果冻无码视频| 久久久青草婷婷精品综合日韩| 亚洲视频欧美在线| 亚洲三级欧美| 欧美r级在线观看| 欧美爱爱免费视频| 成人免费视频免费观看| 精品少妇无遮挡毛片| 欧美三级午夜理伦三级小说| 国产精品国产三级国产aⅴ浪潮| 激情影院在线观看| 亚洲国产中文字幕在线观看| 中文字幕乱码视频| 亚洲国产日韩一区二区| 老女人性生活视频| 99热精品久久| 精品日韩欧美| 高清在线一区二区| 秋霞午夜一区二区| 超碰免费在线播放| 欧美三级电影网站| 精品人妻中文无码av在线| 国产精品夜夜嗨| 一区二区三区 欧美| 亚洲国产日韩欧美一区二区三区| 亚洲福利av在线| 任你躁在线精品免费| 91免费高清视频| 播放一区二区| 国产91精品久久久久久| 日韩一卡二卡在线| 欧美一区二区在线播放| 日韩一级在线视频| 亚洲国产精品麻豆| 九九精品视频免费| 日本一区二区免费在线观看视频| 中文字幕第九页| 99成人精品| 精品无码av无码免费专区| 日韩综合一区| 日韩电影天堂视频一区二区| 麻豆精品99| 成人免费在线一区二区三区| а√在线中文在线新版| 日韩国产一区三区| 亚洲不卡免费视频| 91精品国产综合久久小美女| 日本a级片视频| 亚洲欧洲性图库| 9.1在线观看免费| 国产精品一区二区91| the porn av| 日韩国产在线观看一区| 国产精品无码专区av在线播放| 日韩午夜av| 蜜臀av色欲a片无码精品一区| 老司机凹凸av亚洲导航| 超碰97人人人人人蜜桃| 成人性生活视频| 55夜色66夜色国产精品视频| gratisvideos另类灌满| 欧美激情小视频| 国产丝袜视频在线播放| 国内免费久久久久久久久久久| 欧美理论电影| 亚洲欧美日韩精品久久亚洲区| 亚洲天堂网视频| 亚洲一区二区三区中文字幕在线 | 四虎影视2018在线播放alocalhost| 色综合久久久久综合99| 国产精品人人人人| 欧美午夜精品伦理| 99久久99久久精品国产| 亚洲特黄一级片| 破处女黄色一级片| 亚洲一区二区三区四区的 | 岛国成人毛片| 欧美国产亚洲精品久久久8v| caoporn视频在线| 国产91精品视频在线观看| 成人性教育av免费网址| 国产剧情久久久久久| 57pao成人永久免费| 91精品国产色综合| 欧美大胆a人体大胆做受| 精品国偷自产在线视频99| sm国产在线调教视频| 久久久久久久久久久免费| 在线看片福利| 国产精品无av码在线观看| 精品国产一区二| 精品视频导航| 久久电影院7| 日韩精品在线观看av| 久久国产欧美| 激情文学亚洲色图| 日韩国产高清影视| 在线播放免费视频| 成人午夜大片免费观看| 精品无码一区二区三区| 成人激情文学综合网| 大又大又粗又硬又爽少妇毛片| 欧美激情一区二区在线| 久草视频免费播放| 在线影院国内精品| 亚洲国产精品18久久久久久| 日韩av影视综合网| 国产一区久久精品| 欧洲成人性视频| 国产亚洲字幕| 人禽交欧美网站免费| 自拍偷拍欧美| 免费看污污视频| 国产午夜久久| 超碰91在线播放| 极品少妇xxxx偷拍精品少妇| 五月天激情小说| 国产精品不卡一区二区三区| 女同久久另类69精品国产| 久久久久久久电影| 久久久久久天堂| 欧美日韩一区二区三区免费看| 日本激情一区二区| 久久视频中文字幕| 国产高清一区二区三区视频| 日本免费一区二区三区视频观看| 深夜成人在线| 91情侣在线视频| 136福利精品导航| 国产福利久久| 国产精品成人一区二区不卡| aa在线免费观看| 成人午夜av电影| 国产av无码专区亚洲av毛网站| 在线看日本不卡| 欧美日韩影视| 性欧美在线看片a免费观看| 欧美一级大片在线视频| 婷婷久久青草热一区二区| 日韩精品影视| 50路60路老熟妇啪啪| 成人小视频在线| 综合五月激情网| 欧美日本精品一区二区三区| 免费成人av电影| 91成人福利在线| 精品淫伦v久久水蜜桃| 91视频 - 88av| 韩国v欧美v亚洲v日本v| 香蕉久久久久久久| 亚洲精品福利视频网站| 国产精品日日夜夜| 日韩一区二区精品| av片在线观看网站| 91精品视频在线| 91麻豆精品国产91久久久平台| 我看黄色一级片| 中文一区二区在线观看| 正在播放木下凛凛xv99| 伊人激情综合网| 日韩城人网站| 国产精品日韩一区二区三区| 欧美男gay| 久久久久久久久影视| 激情综合色播五月| 久久爱一区二区| 91麻豆精品久久久久蜜臀| 国内精品不卡| 99在线观看| 国产一区二区三区的电影 | 国产精品国产av| 久久精品91久久香蕉加勒比| 欧美第一在线视频| 日本aa在线观看| 青青草成人在线观看| 少妇熟女视频一区二区三区| 夜夜爽夜夜爽精品视频| 人妻少妇精品无码专区久久| 97人洗澡人人免费公开视频碰碰碰| 欧美色图五月天| 免费看黄色一级大片| 国产精品伦理一区二区| 国产成人精品亚洲男人的天堂| 欧洲精品中文字幕| 午夜视频成人| 欧美最猛性xxxxx(亚洲精品)| 精品视频久久| 深爱五月综合网| 亚洲成人www| 黄上黄在线观看| 国产一区红桃视频| 蜜桃一区二区| 色婷婷成人在线| 久久久久久黄色| 一级欧美一级日韩| 欧美放荡办公室videos4k| 欧美激情网址| 97超碰成人在线| 亚洲成人777| 浮生影视网在线观看免费| 91免费看片网站| 亚洲综合三区| 午夜剧场免费在线观看| 日韩av在线最新| 国产亚洲高清一区| 成人毛片视频网站| 最新不卡av在线| 日本中文字幕电影在线观看 | 精品人妻一区二区三区日产乱码| 韩国日本不卡在线| 久久国产成人精品| 国产ts丝袜人妖系列视频| 欧美日韩免费一区二区三区| 17videosex性欧美| 亚洲欧洲久久| 2024国产精品| 久久久.www| 亚洲人成网站免费播放|