是否可以读取已加载到的网页的原始 HTML 内容UIWebView
?
如果没有,是否有另一种方法可以从 iPhone SDK 的网页中提取原始 HTML 内容(例如 .NET 的等价物WebClient::openRead
)?
第二个问题其实更容易回答。查看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
有点模棱两可,文档对此并没有多说)。
欲了解更多信息:
如果你想提取一个已经加载的 UIWebView 的内容,-stringByEvaluatingJavaScriptFromString。例如:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
要获取整个 HTML 原始数据(使用<head>
和<body>
):
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
请注意,NSString stringWithContentsOfURL 将报告与发出相同请求的 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=''"];
在 Swift v3 中:
let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
(Xcode 5 iOS 7) 适用于 iOS 7 和 Xcode 5 的通用应用程序示例。它是一个开源项目/示例,位于此处:Link to SimpleWebView (Project Zip and Source Code Example)
你应该试试这个:
document.documentElement.outerHTML
我使用这样的快速扩展:
extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}
}
从 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
}