Как получить заголовок страницы HTML, отображаемой в UIWebView?

Мне нужно извлечь содержимое тега title из HTML-страницы, отображаемой в UIWebView. Что является наиболее надежным средством для этого?

Я знаю, что могу:

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

Однако это работает только в том случае, если включен javascript.

В качестве альтернативы я мог бы просто сканировать текст HTML-кода для названия, но это выглядит немного громоздким и может оказаться хрупким, если авторы страниц неловко с их кодом. Если это так, то какой лучший метод использовать для обработки html-текста в iPhone API?

Я чувствую, что забыл что-то очевидное. Есть ли лучший способ, чем эти два варианта?

Обновление:

Следуя ответам на этот вопрос: UIWebView: можно ли отключить Javascript?, похоже, нет способа отключить Javascript в UIWebView. Поэтому метод Javascript выше всегда будет работать.

Ответ 1

Для тех, кто просто прокручивается вниз, чтобы найти ответ:

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

Это всегда будет работать, так как невозможно отключить Javascript в UIWebView.

Ответ 2

Если включен Javascript Используйте это: -

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

Если отключен Javascript Используйте это: -

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

Я использовал +7 и -7 в NSMakeRange, чтобы исключить длину <title> i.e 7

Ответ 3

WKWebView имеет свойство title, просто сделайте так,

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

Я не думаю, что UIWebView подходит прямо сейчас.

Ответ 4

Изменить: просто увидели, что вы узнали ответ... sheeeiiitttt

Я буквально только что узнал об этом! Для этого вам даже не нужно отображать его в UIWebView. (Но поскольку вы используете его, вы можете просто получить URL-адрес текущей страницы)

В любом случае, здесь код и некоторые (слабые) объяснения:

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

Итак, у нас есть HTML-код, как мы можем получить название? Ну, в каждом документе, основанном на html, заголовок обозначается как "Это название" Поэтому, наверное, проще всего искать эту строку htmlCode для, и для нее, и подстроить ее, чтобы мы получили материал между ними.

    //so let 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 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 right

И это действительно так! Таким образом, в основном, чтобы объяснить все махинации, которые происходят в docTitle, если бы мы сделали диапазон, просто указав NSMakeRange (startRange.location, endRange.location), мы получим заголовок И текст startString (который есть), потому что местоположение первый символ строки. Поэтому, чтобы компенсировать это, мы просто добавили длину строки

Теперь имейте в виду, что этот код не проверен. Если есть какие-либо проблемы, это может быть орфографическая ошибка или что я не добавил/не добавил указатель, когда я не должен был.

Если заголовок немного странный и не совсем прав, попробуйте испортить его с помощью NSMakeRange. Я имею в виду, как добавить/вычесть разные длины/расположения строк --- все, что кажется логичным.

Если у вас есть какие-либо вопросы или возникают какие-либо проблемы, не стесняйтесь спрашивать. Этот мой первый ответ на этом сайте так жаль, если он немного дезорганизован

Ответ 5

Вот версия Swift 4, основанная на ответе здесь

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

Ответ 6

У меня есть опыт работы с веб-просмотрами до сих пор, но я считаю, что он задает название заголовка страницы, поэтому я предлагаю использовать категорию в веб-просмотре и перезаписать установщик для self.title, чтобы вы добавили сообщение одному из вас объекту или изменить какое-либо свойство, чтобы получить заголовок.

Не могли бы вы сказать мне, работает ли он?

Ответ 7

Если вам часто нужно это в вашем коде, я предлагаю вам добавить функцию в "расширение UIWebView", как это

extension UIWebView {

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

В качестве альтернативы лучше использовать WKWebView.

К сожалению, это не очень хорошо поддерживается в ARKit. Мне пришлось отказаться от WKWebView. Я не мог загрузить сайт в webView. Если у кого-то есть решение этой проблемы здесь → у меня проблема симлара, это очень поможет.