iPhone - 可以查询维基百科以查看网页是否存在?

时间:2011-08-01 22:10:31

标签: iphone parsing uiwebview wikipedia

我很好奇是否有方法可以查看维基百科页面是否存在,我实现了自定义搜索,用_替换了搜索中的空格,但我无法查看此路径是否确实存在。

    targetWiki = inputCustomTarget.text;
    targetWiki = [targetWiki stringByReplacingOccurrencesOfString:@" " withString:@"_"];
    targetWiki = [NSString stringWithFormat:@"http://en.m.wikipedia.org/wiki/%@", targetWiki];    

我是否必须解析响应以确定页面是否存在?

3 个答案:

答案 0 :(得分:2)

应该无需解析结果,只需检查- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response回调中的200 response code即可。如果它不存在,你应该得到404。

修改

我想补充一点,维基百科页面(不是移动设备.m)上不存在的网页会返回正确的404错误代码。这可能会在未来发生变化,如果他们改变了任何东西,但可能不会完全可靠,但两者都没有解析内容。以下是我用来证明这一点的样本。

NSURLRequest *exists = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/Qwerty"]];
//Redirects to Blivet
NSURLRequest *redirects = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/Poiuyt"]];
NSURLRequest *nonexistant = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/Jklfdsa"]];

NSHTTPURLResponse *resp_exists;
NSHTTPURLResponse *resp_redirects;
NSHTTPURLResponse *resp_nonexistant;

[NSURLConnection sendSynchronousRequest:exists returningResponse:&resp_exists error:NULL];
[NSURLConnection sendSynchronousRequest:redirects returningResponse:&resp_redirects error:NULL];
[NSURLConnection sendSynchronousRequest:nonexistant returningResponse:&resp_nonexistant error:NULL];

NSLog(@"\nExists: %d\nRedirects: %d\nNon Existant: %d", 
      [resp_exists statusCode], 
      [resp_redirects statusCode], 
      [resp_nonexistant statusCode] );

这是输出

  

存在:200
  重定向:200
  不存在:404

因此,如果页面存在或自动重定向到确实存在的页面,您将获得200错误代码,如果它不存在,那么您将获得404.如果您想捕获重定向,则需要实现{{ 3}}并采取相应的行动。

注意:为了紧凑,此示例代码是同步的。这不是理想的,生产实现应该发送异步请求并使用NSURLConectionDelegate方法。

答案 1 :(得分:1)

您无法检查响应代码,因为它始终会返回200响应代码。

我认为查看网页是否存在的最佳方法是解析响应并检查您是否登陆默认的“搜索结果”页面。

另一个选择是使用MediaWiki的API

http://en.wikipedia.org/w/api.php?action=opensearch&search=term

检查返回的响应中是否存在搜索的术语。

答案 2 :(得分:0)

是的,我担心您可能需要解析结果才能知道该页面是否存在。但是,如果您查看此处提供的完整的英语维基百科转储文件,可能有其他选择;

http://en.wikipedia.org/wiki/Wikipedia:Database_download#Latest_complete_dump_of_English_Wikipedia

显然这个原始数据很大,但您可以编写一个解析器来查找所有有效链接,然后将该信息压缩到(比方说)一个您可能觉得可以放在iPhone上的coreData数据库。然后你可以在不必测试页面的情况下运行检查。

但说实话,我可能会解析页面,也许会缓存答案,所以我只需要做一次。

编辑:我担心Joe给出的答案并不完全正确。当我使用原始问题使用的域名(即en.m.wikipedia.org)时,Joe的示例代码会给出以下输出。

Exists: 200
Redirects: 200
Non Existant: 200

如果我使用en.wikipedia.org,那么我的结果与Joe一致,但这不是问题。我的总部设在英国,这可能也会对结果产生影响。