2012-02-17 31 views
0
解析(hpple)div標籤來獲取數據

我試圖用hpple解析下面的鏈接:無法使用HTML在iPhone

http://www.decanter.com/news/wine-news/529748/mimimum-pricing-opponents-slam-cameron-speech

代碼:

- (void)parseURL:(NSURL *)url { 
    NSData *htmlData = [NSData dataWithContentsOfURL:url];  
    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData]; 
    NSArray *elements = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"]; 
    NSLog(@"elements %@",elements); 
    TFHppleElement *element = [elements objectAtIndex:0]; 
    NSString *myTitle = [element content]; 
    [xpathParser release]; 
} 

但正在崩潰。碰撞報告:

XPath error : Invalid expression 
<div class="body" id="article-529748-body"> 
^ 
XPath error : Invalid expression 
<div class="body" id="article-529748-body"> 
^ 

如何解決此問題?爲什麼我的元素數組是空的?我是否以錯誤的方式解析?我想獲得該div標籤中的信息。

回答

0

檢查您的元素數組不爲空

- (void)parseURL:(NSURL *)url { 
NSData *htmlData = [NSData dataWithContentsOfURL:url];  
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData]; 
NSArray *elements = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"]; 
NSLog(@"elements %@",elements); 
if([elements count]){ 
    TFHppleElement *element = [elements objectAtIndex:0]; 
} 
NSString *myTitle = [element content]; 
[xpathParser release]; 
} 
+0

但爲什麼我沒有獲取數據?我是否以錯誤的方式解析? – Dee 2012-02-18 06:48:33

+0

@Dee嘗試使用相同的代碼解析簡單的HTML文件,例如「http://www.gnu.org/licenses/gpl.html」。如果你可以解析它,那麼問題將與惠普。與XML不同,HTML不太容易解析。 – rakeshNS 2012-02-18 12:41:10

0

嘗試改變這一點:

NSArray *elements = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"]; 

要:

NSArray *elements = [xpathParser searchWithXPathQuery:@"//div [@class='body'] [@id=\'article-529748-body\']"]; 
+0

這就是Ray Wenderlich關於如何在iOS上解析HTML的教程。我也知道,當你忘記在一個字符串前面放一個@時,Obj-C有時會彈出。 – JamMySon 2014-08-25 20:31:01

0

寫這篇的情況下,(2年後!)這是對於有類似問題的其他人有用。

爲了在專區內解析HTML,你需要

  1. 使用語法類似(單引號不需要進行轉義),以通過JamMySon此頁面上引用
  2. 請記住,[元素內容]僅爲您提供該節點的內容(如果有),而不是其子節點。

因此,您可能需要使用遞歸來遍歷div的節點樹。

代碼(ARC):

- (void) decanterHpple{ 
    NSURL *url = [NSURL URLWithString:@"http://www.decanter.com/news/wine-news/529748/mimimum-pricing-opponents-slam-cameron-speech"]; 
    NSData *htmlData = [NSData dataWithContentsOfURL:url]; 

    TFHpple *pageParser = [TFHpple hppleWithHTMLData:htmlData]; 

    NSString *queryString = @"//div[@id='article-529748-body']";//1.works with unescaped single-quotes(') AND 2.No need for class='' when using id='' 
    NSArray *elements = [pageParser searchWithXPathQuery:queryString]; 

    //old code ~ slightly amended 
    if([elements count]){ 
     TFHppleElement *element = [elements objectAtIndex:0]; 
     NSString *myTitle = [element content]; 
     NSLog(@"myTitle:%@",myTitle); 
    } 
    //new code 
    NSString *theText = [self stringFromWalkThruNodes:elements]; 
    NSLog(@"theText:%@",theText); 
} 

使用該遞歸方法:

- (NSString*) stringFromWalkThruNodes:(NSArray*) nodes { 
    static int level = 0;//level is only useful for keeping track of recursion when stepping through with a breakpoint 
    level++;//put breakpoint here... 
    NSString *text = @""; 
    for (TFHppleElement *element in nodes){ 
     if (element.content) { 
      text = [text stringByAppendingString:element.content]; 
     } 
     if (element.children) { 
      NSString *innerText = [self stringFromWalkThruNodes:element.children]; 
      text = [text stringByAppendingString:innerText]; 
     } 
    } 
    level--; 
    return text; 
} 

這給出的輸出:

2014年10月22日19:44:07.996潷析[10148:A0B] myTitle:(空)

2014年10月22日19:44:07.9 97 Decanted [10148:a0b] theText:

在訪問英格蘭東北部的一家醫院時,卡梅倫先生要求飲料行業做更多的工作來解決國家衛生服務部門花費2.7英鎊的問題bn的對低於成本價銷售 酒精year.A禁令 - 不到它繳納的稅款 - 被設置爲 從4月6日英格蘭和威爾士出臺,但部長們 有望推動更高的最低價格對於 最低單價drink.Opponents說,這是不公平的,因爲它懲罰所有的飲酒者, 不只是狂飲或酗酒者。響應總理的 評論,葡萄酒和精神貿易協會發言人Gavin Partington 重申飲料行業的承諾,「幫助政府 解決酒精濫用,以及其他利益相關者。」這就是爲什麼我們 努力通過公共衛生責任Partington表示,這些舉措包括擴大社區 英國各地的酒精合作關係以及全國性的運動活動 零售商提高消費者對酒精單位的認知 酒精帕丁頓說,「與這些措施不同,最低單位價格是一種鈍器,都不能解決酒精濫用問題 並懲罰絕大多數負責任的消費者。正如政府部長們承認的那樣,這也可能是非法的.Decker也反對該計劃,稱其爲 '根本上有缺陷'。'真正的問題',編輯蓋伊伍德沃德說,'與超級市場誰使用葡萄酒作爲虧損領導者,削減 利潤率,欺凌供應商和拖低價格,以便 吸引顧客... ...虧損的葡萄酒銷售幫助消費者和 貿易。「該計劃的其他反對者包括英國啤酒和 酒吧協會,其中告訴英國廣播公司,「通過提高稅收完成 是一種危險,這對 酒吧的人,社區酒吧和釀酒商造成巨大損害,造成成千上萬的重要工作。」據認爲,根據歐洲競爭法,對最低定價的任何舉動可能也是非法的,其目的在於推銷消費者的價格並允許公司在免費的市場上運作。

PS。直到今天晚上纔開始和Hpple一起玩。在閱讀上述Wenderlich tutorial後;我敢肯定,更有經驗的人可能會想出更優雅的解決方案!