2012-01-21 19 views
1

htmlファイルを解析するにはどうすればよいですか?iphoneでHtml URLを解析する

スパンタグの間にデータが必要です。

<div id=currency_converter_result>1 AED = <span class=bld>0.4765 ANG</span> 

答えて

1

XHTMLはXMLであるので、あなたはNSXMLParserを使用することを検討することができます

@interface HTMLParser: NSObject <NSXMLParserDelegate> // or whichever superclass you have 
{ 
    // own declarations 
    NSMutableString *str; 
    NSXMLParser *parser; 
} 

// somewhere in a method of self, for example, init, or something named -(void) parseHtml 
- (void) parseHtml 
{ 
    parser = [[NSXMLParser alloc] initWithData:[@"<div id=currency_converter_result>1 AED = <span class=bld>0.4765 ANG</span>" dataUsingEncoding:NSUTF8StringEncoding]]; 
    // of course you can substitute any string you want here, for example, the result of [NSString stringWithContentsOfFile:@"inex.html"] or whatever you need. 
    parser.delegate = self; 
    [parser parse]; 
    [parser release]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementName isEqualToString:@"span"] && [[attributeDict objectForKey:@"class"] isEqualToString:@"bld"]) 
    { 
     str = [NSMutableString string]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    [str appendString:string]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"span"]) 
    { 
     // now str contains the value you want! 
     DoSomethingWith(str); 
    } 
} 

は、この情報がお役に立てば幸いです。あなただけのタグ「スパン」を必要とする場合

+0

を私は、これは古いです知っているが、私はちょうどこれに出くわしました。 HTMLはXMLではありません。 xHTMLはありますが、一般的なHTMLは間違いなく有効なXMLです。 XMLでは、開いているすべてのタグに閉じるタグが必要です。 XMLには適切なタグネストが必要です。 XMLでは、すべての属性値を引用符で囲む必要があります。 HTMLはこれを必要としません。 – rmaddy

+0

@maddyはい、そうですが、不適合コードが気になる人はいますか?少なくとも私はしません。もし私がウェブサイトを作っていたら、XHTMLだけを使うだろう。 –

+0

HTMLがXMLであると誤って主張しました。私はそれを単に指摘しています。はい、チャンスがあれば、xHTMLを使うのは良い考えです。しかし、多くの人々は、xHTMLではないHTMLやHTMLを解析する必要があります。多くの人々は、「不適合な」HTMLコードについて心配する必要があります。それは人生の事実です。 – rmaddy

2

あなたは私がXMLまたはHTMLデータからNSDictionaryのを作成すると、それに取り組むことを好む、などこの1

NSString *html = @"<div id=currency_converter_result>1 AED = <span class=bld>0.4765 ANG</span>"; 
NSRegularExpression *regex = [NSRegularExpression 
           regularExpressionWithPattern:@"<span[^>]*>(.+?)</span>" 
           options:NSRegularExpressionCaseInsensitive 
           error:nil]; 
NSTextCheckingResult *textCheckingResult = [regex firstMatchInString:html options:0 range:NSMakeRange(0, html.length)]; 
NSLog(@"found: '%@'", [html substringWithRange:[textCheckingResult rangeAtIndex:1]]); 

としてNSRegularExpressionを使用したりすることができます。あなたはXML-to-NSDictionaryライブラリでそれを行うことができます。

+0

構造をステップ実行する必要がない場合、これはIMOを実行するのに最適な方法です。 –

1

このチェックアウト: https://github.com/zootreeves/Objective-C-HMTL-Parser

基本的な使い方:

NSError *error = nil; 
NSString *htmlString = 
    @"<div id=currency_converter_result>1 AED = <span class=bld>0.4765 ANG</span>"; 
HTMLParser *p = [[HTMLParser alloc] initWithString:htmlString error:&error]; 

if (error) { 
    NSLog(@"Error: %@", error); 
    return; 
} 

HTMLNode *bodyNode = [p body]; 

NSArray *spanNodes = [bodyNode findChildTags:@"span"]; 

for (HTMLNode *spanNode in spanNodes) { 
    if ([[spanNode getAttributeNamed:@"class"] isEqualToString:@"bld"]) { 
     NSLog(@"%@", [spanNode rawContents]); //Answer to second question 
    } 
}