web-dev-qa-db-fra.com

Comment obtenir le titre d'une page HTML affichée dans UIWebView?

J'ai besoin d'extraire le contenu de la balise de titre d'une page HTML affichée dans un UIWebView. Quel est le moyen le plus robuste de le faire?

Je sais que je peux faire:

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

Cependant, cela ne fonctionne que si javascript est activé. 

Alternativement, je pourrais simplement numériser le texte du code HTML pour le titre, mais cela semble un peu lourd et pourrait s'avérer fragile si les auteurs de la page devenaient flippants avec leur code. Si tel est le cas, quelle est la meilleure méthode à utiliser pour traiter le texte HTML dans l’API de l’iPhone?

Je sens que j'ai oublié quelque chose d'évident. Existe-t-il une meilleure méthode que ces deux choix? 

Mettre à jour:

Suite à la réponse à cette question: UIWebView: Pouvez-vous désactiver le Javascript? Il semble n'y avoir aucun moyen de désactiver le Javascript dans UIWebView. Par conséquent, la méthode Javascript ci-dessus fonctionnera toujours. 

141
TechZen

Pour ceux qui défilent simplement pour trouver la réponse:

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

Cela fonctionnera toujours car il n'y a aucun moyen de désactiver le Javascript dans UIWebView.

86
Brigham

Si Javascript est activé, utilisez ceci: -

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

Si Javascript est désactivé, utilisez ceci: -

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);

J'ai utilisé +7 et -7 dans NSMakeRange pour éliminer la longueur de <title> i.e 7

3
Pawandeep Singh

WKWebView a la propriété 'title', faites-le comme ceci,

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

Je ne pense pas que UIWebView convienne pour le moment.

2
DawnSong

Edit: viens de voir que vous avez trouvé la réponse ... sheeeiiitttt

Je viens littéralement d'apprendre cela! Pour ce faire, vous n'avez même pas besoin de l'afficher dans UIWebView. (Mais comme vous l'utilisez, vous pouvez simplement obtenir l'URL de la page en cours)

Quoi qu'il en soit, voici le code et quelques explications (faibles):

    //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];

Nous avons donc le code HTML, maintenant, comment pouvons-nous obtenir le titre? Eh bien, dans chaque document basé sur le langage HTML, le titre est signalé par This is the Title Donc, la chose la plus simple à faire est de rechercher la chaîne htmlCode, de la rechercher et de la sous-chaîne, afin que nous puissions obtenir le contenu entre les deux.

    //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

Et c’est vraiment ça! Donc, en gros, pour expliquer toutes les manigances qui se passent dans le docTitle, si nous faisions une plage en disant simplement NSMakeRange (startRange.location, endRange.location), nous aurions le titre ET le texte de startString ( ce qui est) parce que l'emplacement est par le premier caractère de la chaîne ..__ Donc, afin de compenser cela, nous avons simplement ajouté la longueur de la chaîne

Maintenant, gardez à l’esprit que ce code n’est pas testé .. s’il ya des problèmes, il s’agit peut-être d’une faute d’orthographe, ou du fait que j’ai/n’a pas ajouté de pointeur alors que je n’étais pas censé le faire.

Si le titre est un peu bizarre et pas tout à fait correct, essayez de jouer avec le NSMakeRange - je veux dire, comme ajouter/soustraire différentes longueurs/emplacements des chaînes - tout ce qui semble logique.

Si vous avez des questions ou s'il y a des problèmes, n'hésitez pas à demander. C'est ma première réponse sur ce site alors désolé si c'est un peu désorganisé

2
user3016226

Voici la version de Swift 4, basée sur la réponse à ici

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

Je n'ai pas d'expérience avec les vues Web jusqu'à présent, mais je crois que cela donne le titre au titre de la page, aussi, une astuce que je suggère est d'utiliser une catégorie sur la vue Web et d'écraser le paramètre pour self.title afin d'ajouter un message l'un de vous objecte ou modifie une propriété pour obtenir le titre.

Pourriez-vous essayer de me dire si cela fonctionne?

0
RP Development

Si vous en avez souvent besoin dans votre code, je vous suggère d'ajouter une fonction dans "extension UIWebView" comme ceci

extension UIWebView {

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

sinon, il vaut mieux utiliser WKWebView.

Malheureusement, ce n'est pas bien supporté dans ARKit. J'ai dû abandonner WKWebView. Je ne pouvais pas charger le site Web dans la WebView. Si quelqu'un a une solution à ce problème ici -> J'ai un problème similaire, cela aiderait beaucoup.

0
MasterNaz