Come ottenere il titolo di una pagina HTML visualizzata in UIWebView?


145

Devo estrarre il contenuto del tag del titolo da una pagina HTML visualizzata in UIWebView. Qual è il mezzo più efficace per farlo?

So di poter fare:

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

Tuttavia, funziona solo se JavaScript è abilitato.

In alternativa, potrei semplicemente scansionare il testo del codice HTML per il titolo, ma mi sembra un po 'ingombrante e potrebbe rivelarsi fragile se gli autori della pagina diventassero strani con il loro codice. In questo caso, qual è il metodo migliore da utilizzare per elaborare il testo HTML all'interno dell'API di iPhone?

Sento di aver dimenticato qualcosa di ovvio. Esiste un metodo migliore di queste due scelte?

Aggiornare:

A seguito della risposta a questa domanda: UIWebView: è possibile disabilitare Javascript? sembra che non ci sia modo di disattivare Javascript in UIWebView. Pertanto, il metodo Javascript sopra funzionerà sempre.


1
+1 Ho anche dovuto ricorrere al metodo @ "document.title".
Dave DeLong,

Stavo solo cercando questo e ho avuto visioni spaventose di analizzare l'HTML. Soluzione molto intelligente.
margusholland,

Vedere anche la seguente risposta a una simile domanda SO: stackoverflow.com/a/2313430/908621
fishinear


Anche la community di supporto Apple ha la stessa risposta
Daniel,

Risposte:


88

Per coloro che scorrono verso il basso per trovare la risposta:

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

Funzionerà sempre in quanto non è possibile disattivare Javascript in UIWebView.


usando questo, se la codifica della pagina web non è 'utf-8', il titolo sarebbe disordinato.
Xiao

Che ne dici di Swift 4?
Jayprakash Dubey,

4

WKWebView ha la proprietà "title", fallo così,

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

Non penso UIWebViewsia adatto al momento.


3

Se Javascript abilitato Utilizzare questo: -

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

Se Javascript disabilitato, utilizzare questo: -

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

Ho usato +7 e -7 in NSMakeRange per eliminare la lunghezza di <title>ie 7


Puoi disabilitare Javascript in UIWebview ora? Nel 2010 non potevi.
TechZen,

Non conosco IOS prima di IOS 8 ma puoi farlo, vai su Impostazioni -> Safari -> Avanzate -> Javascript
attivo

Come fai a sapere se JavaScript è abilitato o disabilitato nel codice?
Eddie,

2

Modifica: appena visto che hai trovato la risposta ... sheeeiiitttt

L'ho appena letteralmente imparato! Per fare ciò, non è nemmeno necessario che sia visualizzato in UIWebView. (Ma mentre lo stai usando, puoi semplicemente ottenere l'URL della pagina corrente)

Ad ogni modo, ecco il codice e alcune spiegazioni (deboli):

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

Quindi abbiamo il codice HTML, ora come possiamo ottenere il titolo? Bene, in ogni documento basato su html il titolo è segnalato da This Is the Title Quindi, probabilmente, la cosa più semplice da fare è cercare quella stringa htmlCode per, e per, e sottostrarla in modo da ottenere il materiale intermedio.

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

E questo è tutto! Quindi, in sostanza, per spiegare tutti gli shenanigans in corso nel docTitle, se facessimo un intervallo semplicemente dicendo NSMakeRange (startRange.location, endRange.location) otterremmo il titolo E il testo di startString (che è) perché la posizione è vicino il primo carattere della stringa. Quindi, per compensare ciò, abbiamo appena aggiunto la lunghezza della stringa

Ora tieni presente che questo codice non è testato .. se ci sono problemi potrebbe trattarsi di un errore di ortografia o che non ho aggiunto / aggiunto un puntatore quando non avrei dovuto.

Se il titolo è un po 'strano e non del tutto corretto, prova a scherzare con NSMakeRange, intendo come aggiungere / sottrarre diverse lunghezze / posizioni delle stringhe, tutto ciò che sembra logico.

In caso di domande o problemi, non esitare a chiedere. Questa è la mia prima risposta su questo sito Web, quindi mi dispiace se è un po 'disorganizzato


1

Ecco la versione di Swift 4, basata sulla risposta qui

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

0

Finora non ho esperienza con le visualizzazioni Web, ma credo che imposti il ​​titolo sul titolo della pagina, quindi un trucco che suggerisco è di utilizzare una categoria in visualizzazione Web e sovrascrivere il setter per self.title in modo da aggiungere un messaggio a uno di voi obietta o modifica alcune proprietà per ottenere il titolo.

Potresti provare a dirmi se funziona?


0

Se ne hai bisogno frequentemente nel tuo codice, ti suggerisco di aggiungere una funzione in "estensione UIWebView" come questa

extension UIWebView {

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

in alternativa è meglio usare WKWebView.

Sfortunatamente, non è ben supportato in ARKit. Ho dovuto rinunciare a WKWebView. Impossibile caricare il sito Web in WebView. Se qualcuno ha una soluzione a questo problema qui -> ho un problema simlar, sarebbe di grande aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.