Как получить заголовок страницы 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. Если у кого-то есть решение этой проблемы здесь → у меня проблема симлара, это очень поможет.