【问题标题】:Reading HTML content from a UIWebView从 UIWebView 读取 HTML 内容
【发布时间】:2010-11-02 19:16:23
【问题描述】:

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

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

【问题讨论】:

    标签: html iphone uiwebview


    【解决方案1】:

    第二个问题其实更容易回答。查看 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 有点模棱两可,文档并没有说太多)。

    更多信息:

    【讨论】:

    • 太棒了!感谢您的出色回答。我认为这两种方法都会导致页面被加载两次,这可能会对性能产生影响。有没有办法避免这种情况?
    • 事实上,有:)已编辑的答案。
    • 是的,[yourWebView loadHTMLString:page baseURL:requestURL];将在页面中运行 Javascript。我已经将此 API 与 Google 地图一起使用。
    • NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"]; 已经好几次成了我的救命稻草。似乎尽可能从文档中返回。
    • @Hanuman 这可能对你有帮助: NSString *head = [yourWebView stringByEvaluatingJavaScriptFromString: @"document.head.innerHTML"]; NSString *body = [yourWebView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"]; NSString *totalPage = 追加两个字符串。
    【解决方案2】:

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

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

    【讨论】:

    • 我的问题是,如果内容恰好是 JSON 字符串,甚至是没有正文标签的原始字符串,会发生什么?
    • 这不是一个健康的解决方案!所有 javascript 代码和标头信息都以这种方式丢失。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 理论上,您可以通过从服务器请求获取文档类型。文档类型可能不会根据用户代理而改变。
      【解决方案5】:

      阅读:-

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

      修改:-

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

      【讨论】:

        【解决方案6】:

        在 Swift v3 中:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            我使用这样的快速扩展:

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

            【讨论】:

              【解决方案9】:

              你应该试试这个:

              document.documentElement.outerHTML
              

              【讨论】:

                【解决方案10】:

                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
                }
                

                [get/set HTML from WKWebView]

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-11-09
                  • 2012-12-26
                  • 1970-01-01
                  • 2014-03-28
                  • 2015-01-16
                  相关资源
                  最近更新 更多