在尝试获取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数据
- iOS Safariclosures时停止HTML5audio循环播放
- 禁用双击以点击触摸屏iOS设备
- 如何在cordova中dynamic加载CSS
- 当touchmove开始时取消touchend事件
- 在深度第2部分中反应本地身份验证-真实世界的身份验证流程
- PhoneGap Cordova InAppBrowser.open不会打开链接,直到在iOS中切换应用程序
- 防止图像上的力触摸事件,但仍允许iOS Safari中的长按事件
- 如何在Safari中打开外部链接而不是应用程序的UIWebView?
- 使用'document.body.scrollHeight'计算UIWebView内容dynamic高度 在iOS 10中返回更大的值