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

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

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

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

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

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

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

Обновлять:

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


person TechZen    schedule 16.02.2010    source источник
comment
+1 Еще пришлось прибегнуть к методу @ document.title.   -  person Dave DeLong    schedule 16.02.2010
comment
Я просто искал это, и у меня возникли пугающие представления о синтаксическом анализе HTML. Очень умное решение.   -  person margusholland    schedule 08.09.2011
comment
См. Также следующий ответ на аналогичный вопрос SO: stackoverflow.com/a/2313430/908621   -  person fishinear    schedule 26.06.2013
comment
На этом портале есть много ссылок, например: stackoverflow.com/questions/11704560/ или stackoverflow.com/questions/2301468/   -  person Kamil Wozniak    schedule 12.11.2013
comment
Сообщество поддержки Apple также предлагает тот же ответ   -  person Daniel    schedule 13.11.2013


Ответы (7)


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

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

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

person Community    schedule 18.11.2013
comment
используя это, если кодировка веб-страницы не является «utf-8», заголовок будет беспорядочным. - person Xiao; 06.01.2014
comment
Как насчет Swift 4? - person Jayprakash Dubey; 10.04.2018

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

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

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

person DawnSong    schedule 06.12.2016

Если включен 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>, т.е. 7

person Pawandeep Singh    schedule 02.06.2015
comment
Можете ли вы сейчас отключить Javascript в UIWebview? Еще в 2010 году вы не могли. - person TechZen; 02.06.2015
comment
Я не знаю о IOS до IOS 8, но вы можете это сделать, перейдите в «Настройки» - ›Safari -› Дополнительно - ›Вкл. / Выкл. Javascript - person Pawandeep Singh; 03.06.2015
comment
Как узнать, включен или отключен javascript в коде? - person Eddie; 15.10.2015

Изменить: только что увидел, что вы узнали ответ ... 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 заголовок обозначается с помощью This Is the Title. Так что, вероятно, проще всего найти в этой строке 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 - я имею в виду, как добавить / вычесть разные длины / местоположения строк - все, что кажется логичным.

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

person user3016226    schedule 21.11.2013

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

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

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

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

person RP Development    schedule 20.11.2013

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

extension UIWebView {

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

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

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

person MasterNaz    schedule 14.07.2019