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

145

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

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

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

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

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

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

Обновить:

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

TechZen
источник
1
+1 Мне также пришлось прибегнуть к методу @ "document.title".
Дэйв Делонг
Я просто искал это и имел страшные видения разбора HTML. Очень умное решение.
Маргушолланд
Смотрите также следующий ответ на аналогичный вопрос SO: stackoverflow.com/a/2313430/908621
fishinear
На этом портале много ссылок, таких как: stackoverflow.com/questions/11704560/… или stackoverflow.com/questions/2301468/…
Камиль Возняк
Сообщество поддержки Apple также имеет тот же ответ
Даниэль

Ответы:

88

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

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

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

Brigham
источник
используя это, если кодировка веб-страницы не 'utf-8', заголовок будет грязным.
Сяо
Как насчет Swift 4?
Джайпракаш Дубей
4

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

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

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

DawnSong
источник
3

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

Павандип Сингх
источник
Можете ли вы отключить Javascript в UIWebview сейчас? Еще в 2010 году ты не мог.
TechZen
Я не знаю о IOS до IOS 8, но вы можете сделать это, перейдите в Настройки -> Safari -> Дополнительно -> Javascript On / Off
Pawandeep Singh
Как узнать, включен ли JavaScript в коде или нет?
Эдди
2

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

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

user3016226
источник
1

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

func webViewDidFinishLoad(_ webView: UIWebView) {
    let theTitle = webView.stringByEvaluatingJavaScript(from: "document.title")
}
низзя
источник
0

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

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

RP Development
источник
0

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

extension UIWebView {

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

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

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

MasterNaz
источник