iOS应用使用WebKit抓取HTML仅获部分内容,求解决建议
嘿,我看你在用WebKit抓取HTML时只拿到部分内容,这情况太常见啦!大多是因为页面还没完全渲染(尤其是JS动态加载的内容)就急着抓取了,给你几个靠谱的解决办法:
解决WebKit抓取HTML不完整的方案
1. 找对抓取的时机
你的代码里直接在viewDidLoad触发加载,但WebView加载是异步的,而且webViewDidFinishNavigation:可能会触发多次(比如页面重定向),得等页面彻底加载完再动手。补全你的导航代理方法:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { // 判断是否是最终的加载完成状态,避免抓重定向的中间页 if (!webView.isLoading) { // 给JS留1-2秒渲染动态内容的时间(时长可以根据目标页面调整) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self grabCompleteHTML:webView]; }); } }
2. 用JS获取渲染后的完整DOM
别用WebView自带的HTML属性(比如UIWebView的HTMLString),对于WKWebView,注入JS直接拿最终渲染后的DOM才是最准的:
- (void)grabCompleteHTML:(WKWebView *)webView { [webView evaluateJavaScript:@"document.documentElement.outerHTML" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (error) { NSLog(@"抓HTML翻车了: %@", error.localizedDescription); return; } // 这里就是完整的HTML源码啦 NSString *fullHTML = result; // 接下来就可以处理你的HTML内容了 }]; }
3. 对付懒加载内容(进阶操作)
如果目标页面有滚动才加载的内容,得先模拟滚动触发加载,再等一会儿抓取:
- (void)handleLazyLoadAndGrab { // 注入JS让页面滚到底部 [self.htmlView evaluateJavaScript:@"window.scrollTo(0, document.body.scrollHeight);" completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (!error) { // 等懒加载内容加载完毕 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self grabCompleteHTML:self.htmlView]; }); } }]; }
4. 确认JS确实开了
虽然你说默认启用了,但还是检查下WKWebView的配置,确保没踩坑:
WKWebViewConfiguration *webConfig = [[WKWebViewConfiguration alloc] init]; webConfig.preferences.javaScriptEnabled = YES; self.htmlView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:webConfig];
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

