Як отримати заголовок HTML-сторінки, що відображається в UIWebView?


145

Мені потрібно витягнути вміст тегу заголовка зі сторінки HTML, відображеної в UIWebView. Який найбільш надійний засіб зробити це?

Я знаю, що можу:

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

Однак це працює лише за умови включення javascript.

Крім того, я міг би просто просканувати текст HTML-коду на предмет заголовка, але він виглядає трохи громіздким і може виявитися крихким, якщо автори сторінки стануть чудернацькими зі своїм кодом. Якщо справа доходить до цього, то який найкращий метод використовувати для обробки тексту HTML у програмі iPhone API?

Я відчуваю, що забув щось очевидне. Чи є кращий метод, ніж ці два варіанти?

Оновлення:

Виходячи з відповіді на це питання: UIWebView: Чи можна вимкнути Javascript? Схоже, немає можливості вимкнути Javascript у UIWebView. Тому метод Javascript вище буде працювати.


1
+1 Я також повинен був вдатися до методу @ "document.title".
Дейв ДеЛонг

Я просто шукав це і мав страхітливі бачення розбору HTML. Дуже розумне рішення.
margusholland

Дивіться також таку відповідь на аналогічне питання 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"];
}

Це завжди працюватиме, оскільки немає можливості вимкнути Javascript у UIWebView.


використовуючи це, якщо кодування веб-сторінки не є 'utf-8', заголовок буде безладним.
Сяо

Як щодо Swift 4?
Джайпракаш Дубей

4

WKWebView має властивість 'title', просто зробіть це так,

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

Не думаю, що UIWebViewзараз підходить.


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
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, заголовок сигналізується "Це є заголовком". Тому, мабуть, найпростіше зробити це пошук у цьому рядку 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

Ось версія Swift 4, заснована на відповіді тут

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

0

Я поки що не маю досвіду роботи з веб-переглядами, але, я вважаю, він встановлює його заголовок на заголовку сторінки, тому, я пропоную трюк - використовувати категорію на веб-перегляді та перезаписати сетер для self.title, щоб ви додали повідомлення до один із вас заперечує або модифікує якусь властивість, щоб отримати назву.

Не могли б ви спробувати сказати мені, чи працює він?


0

Якщо вам це потрібно часто в коді, я пропоную вам додати функцію в "розширення UIWebView", як це

extension UIWebView {

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

В якості альтернативи краще використовувати WKWebView.

На жаль, він не підтримується в ARKit. Мені довелося відмовитися від WKWebView. Не вдалося завантажити веб-сайт у веб-перегляд. Якщо хтось має тут вирішення цього питання -> у мене є симпартова проблема, це допоможе сильно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.