html - app - wkwebview ios
Lectura de contenido HTML desde una UIWebView (9)
¿Es posible leer el contenido HTML sin procesar de una página web que se ha cargado en un UIWebView
?
Si no es así, ¿hay alguna otra forma de extraer contenido HTML sin formato desde una página web en el iPhone SDK (como un equivalente de .NET WebClient::openRead
)?
(Xcode 5 iOS 7) Ejemplo de aplicación universal para iOS 7 y Xcode 5. Es un proyecto / ejemplo de código abierto que se encuentra aquí: Enlace a SimpleWebView (Proyecto Zip y Ejemplo de código fuente)
En Swift v3:
let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
La segunda pregunta es realmente más fácil de responder. Observe la stringWithContentsOfURL:encoding:error:
método de NSString: le permite pasar una URL como una instancia de NSURL (que se puede instanciar fácilmente desde NSString) y devuelve una cadena con el contenido completo de la página en esa URL. Por ejemplo:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
Después de ejecutar este código, googlePage
contendrá el HTML para www.google.com, y el error
contendrá cualquier error encontrado en la búsqueda. (Debe verificar el contenido del error
después de la recuperación).
Ir por el otro lado (desde un UIWebView) es un poco más complicado, pero básicamente es el mismo concepto. Tendrás que extraer la request de la vista, luego hacer la búsqueda como antes:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
EDITAR: Ambos métodos tienen un golpe de rendimiento, sin embargo, ya que hacen la solicitud dos veces. Puede evitar esto al tomar el contenido de un UIWebView actualmente cargado utilizando su método stringByEvaluatingJavascriptFromString:
como tal:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
Esto tomará los contenidos HTML actuales de la vista utilizando el Modelo de Objetos de Documento, analizará el JavaScript y luego se lo entregará como un NSString * de HTML.
Otra forma es hacer su solicitud programáticamente primero y luego cargar el UIWebView a partir de lo que solicitó. Supongamos que toma el segundo ejemplo anterior, donde tiene la NSString *page
como resultado de una llamada a stringWithContentsOfURL:encoding:error:
A continuación, puede insertar esa cadena en la vista web utilizando loadHTMLString:baseURL:
suponiendo que también se aferró al NSURL que solicitó:
[yourWebView loadHTMLString:page baseURL:requestURL];
No estoy seguro, sin embargo, si esto ejecutará JavaScript que se encuentra en la página que carga (el nombre del método, loadHTMLString
, es algo ambiguo, y los documentos no dicen mucho al respecto).
Para más información:
Leer:-
NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById(''your div id'').textContent"];
NSLog(html);
Modificar:-
html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById(''your div id'').textContent=''''"];
Para obtener todos los datos en HTML sin procesar (con <head>
y <body>
):
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
Tenga en cuenta que la cadena NSStringWithContentsOfURL informará una cadena de agente de usuario totalmente diferente que UIWebView haciendo la misma solicitud. Por lo tanto, si su servidor está al tanto de la función del usuario y envía un html diferente según quién lo solicite, es posible que no obtenga los resultados correctos de esta manera.
También tenga en cuenta que @"document.body.innerHTML"
mencionado anteriormente solo mostrará lo que está en la etiqueta de cuerpo. Si usas @"document.all[0].innerHTML"
obtendrás cabeza y cuerpo. Que aún no es el contenido completo de UIWebView, ya que no recibirá las etiquetas! Doctype o html, pero está mucho más cerca.
Uso una extensión rápida como esta:
extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}
}
deberías probar esto:
document.documentElement.outerHTML
si desea extraer el contenido de un UIWebView ya cargado, -stringByEvaluatingJavaScriptFromString. Por ejemplo:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];