从UIWebView读取HTML内容

时间:2009-06-14 07:17:15

标签: html iphone uiwebview

是否可以阅读已加载到UIWebView的网页的原始HTML内容?

如果没有,是否有其他方法可以从iPhone SDK中的网页中提取原始HTML内容(例如相当于.NET WebClient::openRead)?

10 个答案:

答案 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