¿Cómo se muestra el título de una página HTML en UIWebView?

145

Necesito extraer el contenido de la etiqueta del título de una página HTML que se muestra en un UIWebView. ¿Cuál es el medio más sólido para hacerlo?

Sé que puedo hacer:

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}

Sin embargo, eso solo funciona si JavaScript está habilitado.

Alternativamente, podría escanear el texto del código HTML para el título, pero eso se siente un poco engorroso y puede resultar frágil si los autores de la página se vuelven extraños con su código. Si se trata de eso, ¿cuál es el mejor método para procesar el texto html dentro de la API del iPhone?

Siento que he olvidado algo obvio. ¿Existe un método mejor que estas dos opciones?

Actualizar:

A partir de la respuesta a esta pregunta: UIWebView: ¿Puede deshabilitar Javascript? parece que no hay forma de desactivar Javascript en UIWebView. Por lo tanto, el método Javascript anterior siempre funcionará.

TechZen
fuente
1
+1 También tuve que recurrir al método @ "document.title".
Dave DeLong
Solo estaba buscando esto y tuve visiones aterradoras de analizar el HTML. Solución muy inteligente.
margusholland
Consulte también la siguiente respuesta a una pregunta SO similar: stackoverflow.com/a/2313430/908621
fishinear
Hay muchos enlaces en este portal, como: stackoverflow.com/questions/11704560/… o stackoverflow.com/questions/2301468/…
Kamil Wozniak
La comunidad de soporte de Apple también tiene la misma respuesta
Daniel

Respuestas:

88

Para aquellos que simplemente se desplazan hacia abajo para encontrar la respuesta:

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString *theTitle=[webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}

Esto siempre funcionará ya que no hay forma de desactivar Javascript en UIWebView.

Brigham
fuente
usando esto, si la codificación de la página web no es 'utf-8', el título sería desordenado.
Xiao
¿Qué tal Swift 4?
Jayprakash Dubey
4

WKWebView tiene la propiedad 'title', solo hazlo así,

func webView(_ wv: WKWebView, didFinish navigation: WKNavigation!) {
    title = wv.title
}

No creo que UIWebViewsea ​​adecuado en este momento.

DawnSong
fuente
3

Si Javascript está habilitado, use esto: -

NSString *theTitle=[webViewstringByEvaluatingJavaScriptFromString:@"document.title"];

Si Javascript está deshabilitado, use esto: -

NSString * htmlCode = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.appcoda.com"] encoding:NSASCIIStringEncoding error:nil];
NSString * start = @"<title>";
NSRange range1 = [htmlCode rangeOfString:start];

NSString * end = @"</title>";
NSRange range2 = [htmlCode rangeOfString:end];

NSString * subString = [htmlCode substringWithRange:NSMakeRange(range1.location + 7, range2.location - range1.location - 7)];
NSLog(@"substring is %@",subString);

Usé +7 y -7 en NSMakeRange para eliminar la longitud de <title>ie 7

Pawandeep Singh
fuente
¿Puedes deshabilitar Javascript en UIWebview ahora? En 2010 no podías.
TechZen
No conozco IOS antes de IOS 8 pero puedes hacerlo, ve a Configuración -> Safari -> Avanzado -> Javascript activado / desactivado
Pawandeep Singh
¿Cómo saber si JavaScript está habilitado o deshabilitado en el código?
Eddie
2

Editar: acabo de ver que encontraste la respuesta ... sheeeiiitttt

¡Literalmente acabo de aprender esto! Para hacer esto, ni siquiera necesita que se muestre en UIWebView. (Pero mientras lo usa, puede obtener la URL de la página actual)

De todos modos, aquí está el código y alguna explicación (débil):

    //create a URL which for the site you want to get the info from.. just replace google with whatever you want
    NSURL *currentURL = [NSURL URLWithString:@"http://www.google.com"];
    //for any exceptions/errors
    NSError *error;
    //converts the url html to a string
    NSString *htmlCode = [NSString stringWithContentsOfURL:currentURL encoding:NSASCIIStringEncoding error:&error];

Entonces tenemos el código HTML, ahora ¿cómo obtenemos el título? Bueno, en cada documento basado en html, el título está indicado por This Is the Title. Así que probablemente lo más fácil es buscar esa cadena htmlCode por, y por, y subcadenarla para obtener las cosas intermedias.

    //so let's create two strings that are our starting and ending signs
    NSString *startPoint = @"<title>";
    NSString *endPoint = @"</title>";
    //now in substringing in obj-c they're mostly based off of ranges, so we need to make some ranges
    NSRange startRange = [htmlCode rangeOfString:startPoint];
    NSRange endRange = [htmlCode rangeOfString:endPoint];
    //so what this is doing is it is finding the location in the html code and turning it
    //into two ints: the location and the length of the string
    //once we have this, we can do the substringing!
    //so just for easiness, let's make another string to have the title in
    NSString *docTitle = [htmlString substringWithRange:NSMakeRange(startRange.location + startRange.length, endRange.location)];
    NSLog(@"%@", docTitle);
    //just to print it out and see it's right

¡Y eso es todo! Básicamente, para explicar todos los chanchullos que ocurren en el docTitle, si hacemos un rango con solo decir NSMakeRange (startRange.location, endRange.location) obtendríamos el título Y el texto de startString (que es) porque la ubicación es por El primer carácter de la cadena. Entonces, para compensar eso, simplemente agregamos la longitud de la cadena

Ahora tenga en cuenta que este código no se prueba ... si hay algún problema, podría ser un error ortográfico o que no agregué / agregué un puntero cuando no debía hacerlo.

Si el título es un poco extraño y no del todo correcto, intente jugar con NSMakeRange; me refiero a sumar / restar diferentes longitudes / ubicaciones de las cadenas --- cualquier cosa que parezca lógica.

Si tiene alguna pregunta o si tiene algún problema, no dude en preguntar. Esta es mi primera respuesta en este sitio web, lo siento mucho si está un poco desorganizada

usuario3016226
fuente
1

Aquí está la versión Swift 4, basada en la respuesta aquí

func webViewDidFinishLoad(_ webView: UIWebView) {
    let theTitle = webView.stringByEvaluatingJavaScript(from: "document.title")
}
Nizzam
fuente
0

No tengo experiencia con vistas web hasta ahora, pero creo que establece su título en el título de la página, por lo tanto, un truco que sugiero es usar una categoría en la vista web y sobrescribir el configurador para self.title para que agregue un mensaje a uno de ustedes objeta o modifica alguna propiedad para obtener el título.

¿Podrías intentar decirme si funciona?

Desarrollo RP
fuente
0

Si lo necesita con frecuencia en su código, le sugiero que agregue un func en "extension UIWebView" como este

extension UIWebView {

func title() -> String{
    let title: String = self.stringByEvaluatingJavaScript(from: "document.title")!
    return title
}

Alternativamente, es mejor usar WKWebView.

Desafortunadamente, no está bien soportado en ARKit. Tuve que renunciar a WKWebView. No pude cargar el sitio web en webView. Si alguien tiene una solución a este problema aquí -> tengo un problema similar, sería de gran ayuda.

MasterNaz
fuente