从UIWebView读取HTML内容

Fuz*_*key 131 html iphone uiwebview

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

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

Tim*_*Tim 215

第二个问题实际上更容易回答.查看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];
Run Code Online (Sandbox Code Playgroud)

运行此代码后,googlePage将包含www.google.com的HTML,error并将包含fetch中遇到的任何错误.(您应该检查error获取后的内容.)

走另一条路(来自UIWebView)有点棘手,但基本上是相同的概念.您必须从视图中提取请求,然后像以前一样进行提取:

NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&error];
Run Code Online (Sandbox Code Playgroud)

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

NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString: 
                                         @"document.body.innerHTML"];
Run Code Online (Sandbox Code Playgroud)

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

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

[yourWebView loadHTMLString:page baseURL:requestURL];
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否会运行您加载的页面中发现的JavaScript(方法名称,loadHTMLString有点含糊不清,而且文档没有多说明).

欲了解更多信息:

  • `NSString*html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];`现在已经好几次了.它似乎尽可能从文档中返回. (3认同)
  • 事实上,有:)编辑的答案. (2认同)
  • @Hanuman这可能会对你有所帮助:NSString*head = [yourWebView stringByEvaluatingJavaScriptFromString:@"document.head.innerHTML"]; NSString*body = [yourWebView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"]; NSString*totalPage =追加两个字符串. (2认同)

Ben*_*ieb 91

如果要提取已加载的UIWebView,-stringByEvaluatingJavaScriptFromString的内容.例如:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
Run Code Online (Sandbox Code Playgroud)

  • 该死,这很聪明! (10认同)
  • 我遇到的问题是,如果内容恰好是JSON字符串,甚至是没有body标签的原始字符串会发生什么? (2认同)

tuo*_*007 43

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

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
Run Code Online (Sandbox Code Playgroud)


小智 29

请注意,NSString stringWithContentsOfURL将报告与发出相同请求的UIWebView完全不同的用户代理字符串.因此,如果您的服务器是用户代理知道的,并根据谁要求发回不同的html,您可能无法以这种方式获得正确的结果.

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


小智 19

阅读:-

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

修改:-

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