是否可以阅读已加载到UIWebView
的网页的原始HTML内容?
如果没有,是否有其他方法可以从iPhone SDK中的网页中提取原始HTML内容(例如相当于.NET WebClient::openRead
)?
答案 0 :(得分:211)
第二个问题实际上更容易回答。查看NSString的stringWithContentsOfURL:encoding:error:
方法 - 它允许您传入一个URL作为NSURL的实例(可以很容易地从NSString实例化)并返回一个字符串,其中包含该URL的页面的完整内容。例如:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
运行此代码后,googlePage
将包含www.google.com的HTML,error
将包含获取中遇到的任何错误。 (您应该在获取后检查error
的内容。)
走另一条路(来自UIWebView)有点棘手,但基本上是相同的概念。您必须从视图中提取request,然后像以前一样进行提取:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
编辑:但是,这两种方法都会受到性能影响,因为它们会执行两次请求。你可以通过使用stringByEvaluatingJavascriptFromString:
方法从当前加载的UIWebView中获取内容来解决这个问题:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
这将使用文档对象模型获取视图的当前HTML内容,解析JavaScript,然后将其作为HTML的NSString *提供给您。
另一种方法是首先以编程方式执行请求,然后从您请求的内容加载UIWebView。我们假设您采用上面的第二个示例,其中NSString *page
作为调用stringWithContentsOfURL:encoding:error:
的结果。然后,您可以使用loadHTMLString:baseURL:
将该字符串推送到Web视图中,假设您还保留了所请求的NSURL:
[yourWebView loadHTMLString:page baseURL:requestURL];
但是,我不确定这是否会运行您加载的页面中找到的JavaScript(方法名称loadHTMLString
,有点含糊不清,而且文档对此没有太多说明。)< / p>
欲了解更多信息:
答案 1 :(得分:91)
如果要提取已加载的UIWebView,-stringByEvaluatingJavaScriptFromString的内容。例如:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
答案 2 :(得分:43)
获取整个HTML原始数据(包含<head>
和<body>
):
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
答案 3 :(得分:29)
请注意,NSString stringWithContentsOfURL将报告与发出相同请求的UIWebView完全不同的用户代理字符串。因此,如果您的服务器是用户代理识别的,并根据谁的要求发回不同的html,那么您可能无法以这种方式得到正确的结果。
另请注意,上面提到的@"document.body.innerHTML"
只会显示正文标记中的内容。如果你使用@"document.all[0].innerHTML"
,你将获得头部和身体。这仍然不是UIWebView的完整内容,因为它不会取回!doctype或html标签,但它更接近。
答案 4 :(得分:19)
阅读: -
NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);
修改: -
html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
答案 5 :(得分:2)
在Swift v3中:
onResume()
答案 6 :(得分:1)
(Xcode 5 iOS 7)适用于iOS 7和Xcode 5的通用应用程序示例。这是一个开源项目/示例,位于此处:Link to SimpleWebView (Project Zip and Source Code Example)
答案 7 :(得分:1)
你应该试试这个:
document.documentElement.outerHTML
答案 8 :(得分:1)
我使用像这样的快速扩展名:
extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}
}
答案 9 :(得分:0)
另一个例子
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")
get HTML from WKWebView
put HTML into UIWebView
put HTML into WKWebView