Como obter o título de uma página HTML exibido no UIWebView?

145

Preciso extrair o conteúdo da tag title de uma página HTML exibida em um UIWebView. Qual é o meio mais robusto de fazer isso?

Eu sei que posso fazer:

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

No entanto, isso só funciona se o javascript estiver ativado.

Como alternativa, eu poderia apenas digitalizar o texto do código HTML para obter o título, mas isso parece um pouco complicado e pode ser frágil se os autores da página ficarem esquisitos com o código. Se for esse o caso, qual é o melhor método para processar o texto html na API do iPhone?

Sinto que esqueci algo óbvio. Existe um método melhor do que essas duas opções?

Atualizar:

Após a resposta a esta pergunta: UIWebView: você pode desativar o Javascript? parece não haver maneira de desativar o Javascript no UIWebView. Portanto, o método Javascript acima sempre funcionará.

TechZen
fonte
1
+1 Eu também tive que recorrer ao método @ "document.title".
Dave DeLong
Eu estava apenas procurando por isso e tive visões assustadoras de analisar o HTML. Solução muito inteligente.
margusholland
Consulte também a resposta a seguir para uma pergunta SO semelhante: stackoverflow.com/a/2313430/908621
fishinear próximo de 26/06/2013
Existem muitos links neste portal, como: stackoverflow.com/questions/11704560/… ou stackoverflow.com/questions/2301468/…
Kamil Wozniak:
A comunidade de suporte da Apple também tem a mesma resposta
Daniel

Respostas:

88

Para aqueles que simplesmente rolam para baixo para encontrar a resposta:

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

Isso sempre funcionará, pois não há como desativar o Javascript no UIWebView.

Brigham
fonte
usando isso, se a codificação da página da web não for 'utf-8', o título ficará confuso.
Xiao
E o Swift 4?
Jayprakash Dubey
4

WKWebView tem propriedade 'title', faça assim,

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

Eu não acho que UIWebViewseja adequado agora.

DawnSong
fonte
3

Se o Javascript estiver ativado, use este: -

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

Se o Javascript estiver desativado, use este: -

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

Usei +7 e -7 no NSMakeRange para eliminar o comprimento de <title>7

Pawandeep Singh
fonte
Você pode desativar o Javascript no UIWebview agora? Em 2010, você não podia.
TechZen 02/06/2015
Eu não sei sobre IOS antes do IOS 8, mas você pode fazê-lo, vá em Configurações para -> Safari -> Avançado -> Javascript On / Off
Pawandeep Singh
Como você sabe se o javascript está ativado ou desativado no código?
Eddie
2

Edit: só ​​vi você descobriu a resposta ... sheeeiiitttt

Eu literalmente aprendi isso! Para fazer isso, você nem precisa exibi-lo no UIWebView. (Mas enquanto você o usa, é possível obter o URL da página atual)

De qualquer forma, aqui está o código e alguma explicação (fraca):

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

Então, temos o código HTML, agora como obtemos o título? Bem, em todo documento baseado em html, o título é sinalizado por Este é o título. Provavelmente, a coisa mais fácil a fazer é pesquisar essa string htmlCode por, e por, e substring-lo para que possamos colocar o material no meio.

    //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 é isso mesmo! Então, basicamente, para explicar todas as travessuras do docTitle, se fizéssemos um intervalo dizendo NSMakeRange (startRange.location, endRange.location), obteríamos o título E o texto de startString (que é) porque o local é o primeiro caractere da sequência. Então, para compensar isso, adicionamos o comprimento da string

Agora, lembre-se de que esse código não foi testado. Se houver algum problema, pode haver um erro de ortografia ou que eu não adicionei um ponteiro quando não deveria.

Se o título é um pouco estranho e não está totalmente certo, tente mexer com o NSMakeRange - quero dizer como adicionar / subtrair diferentes comprimentos / locais das strings - qualquer coisa que pareça lógico.

Se você tiver alguma dúvida ou houver algum problema, não hesite em perguntar. Esta é a minha primeira resposta neste site, desculpe se é um pouco desorganizado

user3016226
fonte
1

Aqui está a versão Swift 4, com base na resposta aqui

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

Até agora, eu não tenho experiência com visualizações na Web, mas acredito que define o título para o título da página, portanto, um truque que sugiro é usar uma categoria na visualização na Web e sobrescrever o configurador para self.title para adicionar uma mensagem a um de vocês se opõe ou modifica alguma propriedade para obter o título.

Você poderia tentar me dizer se funciona?

Desenvolvimento RP
fonte
0

Se você precisar com frequência no seu código, sugiro que você adicione uma func na "extensão UIWebView" como esta

extension UIWebView {

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

alternativamente, é melhor usar o WKWebView.

Infelizmente, não é bem suportado no ARKit. Eu tive que desistir do WKWebView. Não consegui carregar o site no webView. Se alguém tiver uma solução para esse problema aqui -> eu tenho um problema semelhante, isso ajudaria bastante.

MasterNaz
fonte