从UIWebView读取HTML内容

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

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

第二个问题实际上更容易回答。 查看stringWithContentsOfURL:encoding:error: NSString的stringWithContentsOfURL:encoding:error:方法 – 它可以让你传入一个URL作为NSURL的实例(可以很容易地从NSString实例化),并返回一个string,该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"]; 

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

另一种方法是首先以编程方式执行您的请求,然后从您请求的内容中加载UIWebView。 假设你拿上面的第二个例子,在那里你有NSString *page作为调用stringWithContentsOfURL:encoding:error:的结果stringWithContentsOfURL:encoding:error: 然后,您可以使用loadHTMLString:baseURL:将该string推送到Web视图中,假设您还保留了所请求的NSURL:

 [yourWebView loadHTMLString:page baseURL:requestURL]; 

但是,我不确定这是否会运行在您加载的页面中find的Javascript(方法名称, loadHTMLString ,有点含糊不清,文档没有太多说明)。

欲了解更多信息:

  • UIWebView类的参考
  • NSString类的引用
  • NSURL类的参考

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

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

获取整个html原始数据(用&)

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

请注意,NSString stringWithContentsOfURL将报告一个完全不同的用户代理string,而不是UIWebView发出相同的请求。 所以,如果你的服务器是用户代理感知的,并根据谁的要求发回不同的html,你可能不会得到正确的结果。

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

读书:-

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

修改:-

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

(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") } }