从 UIWebView 读取 HTML 内容

有没有可能读取一个网页的原始 HTML 内容,已经加载到一个 UIWebView

如果没有,是否有另一种方法可以从 iPhone SDK 中的网页中提取原始 HTML 内容(例如。NET WebClient::openRead) ?

151944 次浏览

第二个问题实际上更容易回答。看看 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)有点棘手,但基本上是相同的概念。您必须从视图中提取 请求,然后像前面一样执行提取操作:

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"];

这将使用 Document Object Model 获取视图的当前 HTML 内容,解析 JavaScript,然后将其作为 HTML 的 NSString * 提供给您。

另一种方法是首先以编程方式执行请求,然后从请求中加载 UIWebView。让我们看看上面的第二个例子,其中 NSString *page是对 stringWithContentsOfURL:encoding:error:调用的结果。然后,您可以使用 loadHTMLString:baseURL:将该字符串推入 Web 视图,假设您还保留了所请求的 NSURL:

[yourWebView loadHTMLString:page baseURL:requestURL];

但是,我不确定这是否会运行在您加载的页面中找到的 JavaScript (方法名称 loadHTMLString有些模糊,文档中也没有多说)。

更多信息:

如果希望提取已加载的 UIWebView 的内容,请使用-stringByevalatingJavaScriptFromString。例如:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];

阅读:-

NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);

修改:-

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];

注意,NSString stringWithContentsOfURL 将报告一个与发出相同请求的 UIWebView 完全不同的用户代理字符串。因此,如果您的服务器是用户代理感知的,并且根据请求它的用户发送不同的 html,那么您可能无法通过这种方式得到正确的结果。

还要注意,上面提到的 @"document.body.innerHTML"只显示 body 标记中的内容。如果你使用 @"document.all[0].innerHTML",你将得到头部和身体。这还不是 UIWebView 的完整内容,因为它不会返回!Doctype 或者 html 标签,但是它更接近。

要获得完整的 HTML 原始数据(使用 <head><body>) :

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

(Xcode 5 iOS 7) iOS 7和 Xcode 5的通用应用程序示例。它是一个开源项目/示例,位于这里: 链接到 SimpleWebView (项目邮政编码和源代码示例)

你应该试试这个:

document.documentElement.outerHTML

在 Swift v3中:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")

我使用这样的快速扩展:

extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}


}

UIWebView

从 UIWebView 获取 HTML

let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")

将 HTML 设置为 UIWebView

//Do not forget to extend a class from `UIWebViewDelegate` and nil the delegate


func someFunction() {


let uiWebView = UIWebView()
uiWebView.loadHTMLString("<html><body></body></html>", baseURL: nil)
uiWebView.delegate = self as? UIWebViewDelegate
}


func webViewDidFinishLoad(_ webView: UIWebView) {
//ready to be processed
}

[从 WKWebView 获取/设置 HTML ]