Как получить заголовок HTML-страницы, отображаемой в UIWebView? - PullRequest
142 голосов
/ 16 февраля 2010

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

Я знаю, что могу сделать:

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

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

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

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

Обновление:

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

Ответы [ 6 ]

87 голосов
/ 19 ноября 2013

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

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

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

3 голосов
/ 06 декабря 2016

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

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

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

3 голосов
/ 02 июня 2015

Если 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> т.е.

2 голосов
/ 21 ноября 2013

Редактировать: только что увидел, что вы нашли ответ ... 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'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

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

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

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

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

1 голос
/ 25 апреля 2018

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

func webViewDidFinishLoad(_ webView: UIWebView) {
    let theTitle = webView.stringByEvaluatingJavaScript(from: "document.title")
}
0 голосов
/ 21 ноября 2013

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

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

...