0

这是一个 html 示例(实际页面上的标记 #s 更改): http://nonlinearmind.no-ip.org:8888/ token.html

从页面中,我需要为以下变量转义信息:

username = <title>
session = <h1>
token = <h2>

实现这一目标的最简单方法是什么?

4

2 回答 2

2

你能控制那个token.html来源吗?如果它可以返回 JSON 或 XML,而不是 HTML,那将是最好的。它极大地简化了解析过程。

但是您可以轻松地将页面加载到NSDatavia 中:

NSError *error = nil;
NSURL *url = [NSURL URLWithString:@"http://nonlinearmind.no-ip.org:8888/token.html"];
NSData *htmlData = [NSData dataWithContentsOfURL:url options:0 error:&error];
if (error != nil)
{
    NSLog(@"%s unable to load URL '%@'; error = %@", __FUNCTION__, url.absoluteString, error);
}

NSString通过:

NSError *error = nil;
NSURL *url = [NSURL URLWithString:@"http://nonlinearmind.no-ip.org:8888/token.html"];
NSString *htmlString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (error != nil)
{
    NSLog(@"%s unable to load URL '%@'; error = %@", __FUNCTION__, url.absoluteString, error);
}

你可以从那里解析它。

例如,要从被调用的<h1>打开和关闭标记之间获取所有文本,您可以:NSStringhtmlString

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<h1>(.*?)</h1>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
if (error != nil)
{
    NSLog(@"%s regex error: %@", __FUNCTION__, error);
}

NSMutableArray *matches = [NSMutableArray array];

[regex enumerateMatchesInString:htmlString
                        options:0
                          range:NSMakeRange(0, [htmlString length])
                     usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                         // the string including html tags is [htmlString substringWithRange:result.range]
                         NSRange matchRange = [result rangeAtIndex:1];

                         [matches addObject:[htmlString substringWithRange:matchRange]];
                     }];

NSString *first = matches[0];
NSString *second = matches[1];
// etc.

NSLog(@"first=%@", first);
NSLog(@"second=%@", second);

我知道你没有说你可以做 JSON,但如果可以的话,iOS 实现非常简单。因此,假设您有一个返回 JSON 结果的 URL,例如:

{
    "username" : "myusername",
    "session" : "mysessionidentifier",
    "token" : "somecryptictoken2340923923402309234"
}

然后你可以解析它:

NSURL *url = [NSURL URLWithString:@"http://nonlinearmind.no-ip.org:8888/token.json"];
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:url
                                     options:0
                                       error:&error];
if (error != nil)
{
    NSLog(@"%s data read error %@", __FUNCTION__, error);
    return;
}

NSDictionary *results = [NSJSONSerialization JSONObjectWithData:data
                                                        options:0
                                                          error:&error];

if (error != nil)
{
    NSLog(@"%s JSON parse error %@", __FUNCTION__, error);
    return;
}

NSLog(@"username = %@", results[@"username"]);
NSLog(@"session = %@", results[@"session"]);
NSLog(@"token = %@", results[@"token"]);
于 2012-11-29T18:42:59.460 回答
0

这是在 iOS 应用程序中解析 HTML 的绝佳教程

它为您提供了解析一个非常基本的 HTML 页面的详细逐步概述,因此它非常适合您上面的示例。

它还向您展示了如何将已解析的标题放入 TableView。我认为了解解析过程对您来说更有用,而不仅仅是将代码发布到您的问题中。

于 2012-11-29T18:41:37.380 回答