1

Objective-Cについての質問です。HTML全体を取得して正規表現を使用するプログラムを作成しました。プログラムを GitHub にアップロードしました。ただし、例外が発生します。

このプログラムの目的は、正規表現一致によって「og:image」を取得することです。FacebookでURLを書いて表示される画像です。この画像を設定するには、HTML で次のように記述します。

<meta property="og:image"
content="http://business.nikkeibp.co.jp/article/NBD/20120727/235043/zu1.jpg">

そこで、HTML全体を取得してog:image部分を見つけるプログラムを書きました。コードは以下のとおりです。

// Web page address
NSURL *url = [NSURL URLWithString:textField.text];

// Get the web page HTML
NSString *string = 
[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

// prepare regular expression to find text
NSError *error   = nil;
NSRegularExpression *regexp =
[NSRegularExpression regularExpressionWithPattern:
 @"<meta property=\"og:image\" content=\".+\""
                                          options:0
                                            error:&error];

@try {
    // find by regular expression
    NSTextCheckingResult *match =
    [regexp firstMatchInString:string options:0 range:NSMakeRange(0, string.length)];

    // get the first result
    NSRange resultRange = [match rangeAtIndex:0];
    NSLog(@"match=%@", [string substringWithRange:resultRange]); 

    if (match) {

        // get the og:image URL from the find result
        NSRange urlRange = NSMakeRange(resultRange.location + 35, resultRange.length - 35 - 1);
        NSURL *urlOgImage = [NSURL URLWithString:[string substringWithRange:urlRange]];
        imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:urlOgImage]];
    }
}

コード全体は、以下のように GitHub にあります。

https://github.com/weed/p120728_GetOgImage/blob/master/GetOgImage/ViewController.m

ただし、このプログラムは例外を介して実行されることがあります。

  • 成功事例:<a href="http://www.nicovideo.jp/watch/1343369790" rel="nofollow">http://www.nicovideo.jp/watch/1343369790

  • 失敗例:<a href="http://business.nikkeibp.co.jp/article/NBD/20120727/235043/?ST=pc" rel="nofollow">http://business.nikkeibp.co.jp /article/NBD/20120727/235043/?ST=pc

スクリーンショットはこちら: https://github.com/weed/p120728_GetOgImage/blob/master/readme.md

なぜ例外が発生するのですか?教えて下さい。ご協力ありがとうございました。

4

2 に答える 2

1

私の友人は、文字エンコーディングの検討について親切に指摘しました。最初の URL ページの文字エンコードは UTF-8、2 つ目の URL ページは EUC-JP です。

以下のコードで、上に示した 2 番目の URL の og:image を取得できました。

- (NSString *)encodedStringWithContentsOfURL:(NSURL *)url
{
    // Get the web page HTML
    NSData *data = [NSData dataWithContentsOfURL:url];

    // response
    int enc_arr[] = {
        NSUTF8StringEncoding,           // UTF-8
        NSShiftJISStringEncoding,       // Shift_JIS
        NSJapaneseEUCStringEncoding,    // EUC-JP
        NSISO2022JPStringEncoding,      // JIS
        NSUnicodeStringEncoding,        // Unicode
        NSASCIIStringEncoding           // ASCII
    };
    NSString *data_str = nil;
    int max = sizeof(enc_arr) / sizeof(enc_arr[0]);
    for (int i=0; i<max; i++) {
        data_str = [
               [NSString alloc]
               initWithData : data
               encoding : enc_arr[i]
               ];
        if (data_str!=nil) {
               break;
        }
    }
    return data_str;    
}

という名前の文字エンコーディングのチェックライブラリを作りましたNSString+Encode。コード全体は GitHub にあります。

https://github.com/weed/p120728_OgImageLibrary

于 2012-07-28T10:00:02.060 に答える
0

正規表現が 2 ページ目の結果と一致していないようです。そのページの html ソースを正規表現テスターでテストしましたか?

このような何かがうまくいくはずです:http://regexpal.com/

于 2012-07-28T09:07:43.220 に答える