在尝试获取HTML内容时被阻止

我试图从网站获取HTML内容,但它被JavaScript阻止。

这是实施:

- (void)viewDidLoad { NSURL *htmlUrl = [NSURL URLWithString:@"https://color.adobe.com/explore/most-popular/?time=week"]; NSStringEncoding htmlEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8); NSString *htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil]; NSLog(@"%@",htmlString); NSData *htmlData = [htmlString dataUsingEncoding:NSUTF8StringEncoding]; TFHpple *htmlHpple = [TFHpple hppleWithHTMLData:htmlData]; } 

NSLog输出的一部分:

  

JavaScript Disabled

Adobe Color CC requires JavaScript in order to load properly. Please enable JavaScript in your browser and reload the page.

  • JavaScript est désactivé

    Pour pouvoir se charger correctement, Adobe Color CC requiert JavaScript. Veuillez activer JavaScript dans votre navigateur et recharger la page.

    JavaScript ist erforderlich, damit Adobe Color CC ordnungsgemäß geladen wird. Aktivieren Sie JavaScript im Browser und laden Sie die Seite neu.

  • JavaScript が無効です

    Adobe Color CC で正しく読み込みを行うには、JavaScript が必要です。ご使用のブラウザーで JavaScript を有効にして、ページを再読み込みしてください。

  • JavaScript desactivado

    Para que Adobe Color CC pueda cargarse correctamente, se requiere JavaScript. Active JavaScript en el navegador y vuelva a cargar la página.

  • 那不是我想要的。

    实际上,当你打开url时,你可以看到很多颜色。 这就是我要解析和获取的内容。

    但不是

    JavaScript Disabled

    Adobe Color CC requires JavaScript in order to load properly. Please enable JavaScript in your browser and reload the page.

    我从你提供的url分析和查找的地方是,它只使用简单的http请求加载网页的一部分,并使用ajax请求加载所有其他部分,如颜色。 所以当你要求使用简单的代码时
    NSString *htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];

    然后它不会提供Web浏览器中显示的一大堆html代码,但只提供一小部分。 如果你想要整个html代码,然后使用UIWebView加载url,然后当web视图完成加载,然后使用代码找到html字符串

    NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];

    它将为您提供Web浏览器中显示的整个HTML代码,现在您可以找到您想要的任何内容。

    重要说明:要查找webView何时完成ajax加载,您必须在webView中注入一些java脚本,以便在ajax请求完成加载时调用您的委托。 或者只是validation我可以简单使用的代码

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"]; }); 

    在ajax请求将在20秒内完成加载时调用您的代码。 内部Web视图委托方法

    - (void)webViewDidFinishLoad:(UIWebView *)webView

    希望这是你想要的,还有一件事是javascript默认包含在webView中,你不需要自己注入它。

    如果你想获取html数据,那么你可以尝试如下: –

      TFHpple *htmlHpple = [TFHpple hppleWithHTMLData:htmlData]; 

    //之后包括以下用于获取数据的代码行

      NSString *htmlXpathQueryString = @"//h1"; NSArray *htmlNodes = [tutorialsParser searchWithXPathQuery:htmlXpathQueryString]; for (TFHppleElement *element in htmlNodes) { NSLog(@"%@",[[element firstChild] content]); } 

    有关更多详细信息,请参阅如何解析Html数据