146 votes

Comment obtenir le titre d’une Page HTML affichée dans UIWebView ?

J'ai besoin d'extraire le contenu de la balise title d'une page HTML affichée dans une UIWebView. Qu'est-ce que les plus robustes, les moyens de le faire?

Je sais que je peux faire:

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

Toutefois, cela ne fonctionne que si le javascript est activé.

Sinon, je pourrais suffit de scanner le texte du code HTML pour le titre, mais qui se sent un peu lourde et pourrait s'avérer fragile si la page auteurs du got bizarre avec leur code. Si on en arrive là, quelle est la meilleure méthode à utiliser pour le traitement du texte html au sein de l'iPhone API?

J'ai l'impression que j'ai oublié quelque chose d'évident. Est-il une meilleure méthode que ces deux choix?

Mise à jour:

La suite de la réponse à cette question: UIWebView: Pouvez-Vous Désactiver le Javascript? il semble y avoir aucun moyen de désactiver Javascript dans UIWebView. Par conséquent, la méthode Javascript ci-dessus sera toujours.

89voto

Brigham Points 6316

Pour ceux qui font juste défiler 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 Javascript dans UIWebView.

2voto

user3016226 Points 8

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

J'ai littéralement juste appris cela! Pour ce faire, vous n'avez même pas besoin de l'afficher dans UIWebView. (Mais que vous l'utilisez, vous pouvez simplement obtenir l'URL de la page en cours)

De toute façon, voici le code et quelques (faibles) explication:

    //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 tous les html doc le titre est signalé par là, C'Est le Titre C'est probablement la meilleure chose à faire est de la recherche de l'htmlCode chaîne pour et pour , et substring il nous obtenons donc le choses entre.

    //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 se passe dans le docTitle, si nous avons fait une plage juste en disant NSMakeRange(startRange.emplacement, endRange.emplacement) nous permettrait d'obtenir le titre ET le texte de startString (qui est ) parce que la situation est par le premier caractère de la chaîne. Afin de compenser cela, nous venons d'ajouter la longueur de la chaîne

Maintenant, gardez à l'esprit ce code n'est pas testé.. si il y a des problèmes, il pourrait être une erreur d'orthographe, ou que je n'ai pas/ne s'ajouter un pointeur quand je n'étais pas censé le faire.

Si le titre est un peu bizarre et pas complètement à droite, essayez de déconner avec le NSMakeRange-- je veux dire ajouter/soustraire différentes longueurs/emplacements des chaînes de --- tout ce qui semble logique.

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

0voto

ersentekin Points 190

Vous pouvez obtenir le contenu de la balise title à l'aide de Regex.

 NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<title[^>]*>(.*?)</title>"
    options:NSRegularExpressionCaseInsensitive
    error:&error];

// type your url here
NSURL *url = [NSURL URLWithString:@"http://www.ersentekin.com"];
NSString *urlStr= [NSString stringWithContentsOfURL:url usedEncoding:nil error:nil];

[regex enumerateMatchesInString:urlStr
    options:0
    range:NSMakeRange(0, [urlStr length])
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

    NSString *title = [urlStr substringWithRange:[result rangeAtIndex:1]];
        NSLog(@"title : %@",title);
                     }];
 

0voto

fast Points 23

S'il vous plaît suivez le lien que j'ai donné ici réponse

0voto

RP Development Points 85

Je n'ai pas d'expérience avec Webviews jusqu'à présent, mais je crois que cela définit son titre au titre de la page, donc, je suggère d'utiliser une catégorie sur Webview et d'écraser le setter pour self.title afin d'ajouter un message à l'un d'entre vous objecte ou modifie une propriété pour obtenir le titre.

Pourriez-vous essayer de me dire si cela fonctionne?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X