133

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

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

4

10 回答 10

216

第二个问题其实更容易回答。查看stringWithContentsOfURL:encoding:error:NSString 的方法 - 它允许您将 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];

编辑:但是,这两种方法都会对性能造成影响,因为它们会执行两次请求。您可以通过使用其方法从当前加载的 UIWebView 中获取内容来解决此问题stringByEvaluatingJavascriptFromString:,如下所示:

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

这将使用文档对象模型获取视图的当前 HTML 内容,解析 JavaScript,然后将其作为 HTML 的 NSString* 提供给您。

另一种方法是首先以编程方式执行您的请求,然后从您请求的内容加载 UIWebView。假设您采用上面的第二个示例,其中NSString *page调用stringWithContentsOfURL:encoding:error:. 然后,您可以使用 将该字符串推送到 Web 视图中loadHTMLString:baseURL:,假设您还保留了您请求的 NSURL:

[yourWebView loadHTMLString:page baseURL:requestURL];

但是,我不确定这是否会运行在您加载的页面中找到的 JavaScript(方法名称 ,loadHTMLString有点模棱两可,文档对此并没有多说)。

欲了解更多信息:

于 2009-06-14T07:32:56.057 回答
92

如果你想提取一个已经加载的 UIWebView 的内容,-stringByEvaluatingJavaScriptFromString。例如:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
于 2009-06-14T14:14:18.120 回答
44

要获取整个 HTML 原始数据(使用<head><body>):

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
于 2012-04-16T17:46:32.950 回答
29

请注意,NSString stringWithContentsOfURL 将报告与发出相同请求的 UIWebView 完全不同的用户代理字符串。因此,如果您的服务器能够识别用户代理,并根据请求者的不同发回不同的 html,那么您可能无法通过这种方式获得正确的结果。

另请注意,@"document.body.innerHTML"上述内容只会显示 body 标签中的内容。如果你使用@"document.all[0].innerHTML",你会得到头部和身体。这仍然不是 UIWebView 的完整内容,因为它不会取回 !doctype 或 html 标签,但它更接近。

于 2010-11-30T19:30:58.637 回答
20

读书:-

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

修改:-

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
于 2009-10-22T17:32:02.430 回答
2

在 Swift v3 中:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
于 2017-06-10T12:30:44.850 回答
1

(Xcode 5 iOS 7) 适用于 iOS 7 和 Xcode 5 的通用应用程序示例。它是一个开源项目/示例,位于此处:Link to SimpleWebView (Project Zip and Source Code Example)

于 2014-01-21T04:42:17.340 回答
1

你应该试试这个:

document.documentElement.outerHTML
于 2014-05-14T11:18:15.827 回答
1

我使用这样的快速扩展:

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

}
于 2017-07-11T07:05:45.727 回答
1

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]

于 2019-07-17T19:38:10.437 回答