Чи можна прочитати сирий HTML-вміст веб-сторінки, завантаженої у UIWebView
?
Якщо ні, чи є інший спосіб витягнути сирий HTML-вміст із веб-сторінки в SDK для iPhone (наприклад, еквівалент .NET WebClient::openRead
)?
Чи можна прочитати сирий HTML-вміст веб-сторінки, завантаженої у UIWebView
?
Якщо ні, чи є інший спосіб витягнути сирий HTML-вміст із веб-сторінки в SDK для iPhone (наприклад, еквівалент .NET WebClient::openRead
)?
Відповіді:
На друге питання насправді простіше відповісти. Подивіться на stringWithContentsOfURL:encoding:error:
метод NSString - він дозволяє переходити за URL-адресою як екземпляр NSURL (який легко інстанціювати з NSString) і повертає рядок із повним вмістом сторінки за цією URL-адресою. Наприклад:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
Після запуску цього коду, він googlePage
буде містити HTML для www.google.com і error
буде містити будь-які помилки, що виникають у завантаженні. (Ви повинні перевірити вміст error
після завантаження.)
Інший шлях (від UIWebView) трохи складніше, але в основному той самий поняття. Вам потрібно буде витягнути запит із подання, а потім зробити це, як раніше:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
EDIT: Однак обидва ці способи вражають ефективність, оскільки вони виконують запит двічі. Ви можете обійти це, захопивши вміст із завантаженого на даний момент UIWebView, використовуючи його stringByEvaluatingJavascriptFromString:
метод, як такий:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
Це дозволить схопити поточний вміст HTML у представленні за допомогою моделі об'єкта документа, проаналізувати JavaScript, а потім надати вам його як NSString * HTML.
Інший спосіб - спочатку виконати запит програмно, а потім завантажити UIWebView з того, що ви просили. Скажімо, ви взяли другий приклад вище, де ви отримали NSString *page
результат дзвінка stringWithContentsOfURL:encoding:error:
. Потім ви можете натиснути цей рядок у веб-перегляд, використовуючи loadHTMLString:baseURL:
, припускаючи, що ви також тримаєте NSURL, про який ви просили:
[yourWebView loadHTMLString:page baseURL:requestURL];
Я не впевнений, але якщо це запустить JavaScript, знайдений на завантажуваній сторінці (назва методу, loadHTMLString
, є дещо неоднозначним, і документи не говорять про це багато).
Для отримання додаткової інформації:
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
був рятівним рятувальником для мене вже кілька разів. Здається, повертається з документа якнайбільше.
якщо ви хочете витягти вміст уже завантаженого UIWebView, -stringByEvaluatingJavaScriptFromString. Наприклад:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
Зауважте, що рядок NSStringWithContentsOfURL повідомить про зовсім інший рядок агента користувача, ніж UIWebView, що робить той самий запит. Отже, якщо ваш сервер обізнаний з користувачем-агентом, і надсилаючи назад різні HTML-файли, залежно від того, хто просить, ви, таким чином, не зможете отримати правильних результатів.
Також зверніть увагу, що @"document.body.innerHTML"
згадане вище відображатиме лише те, що є в тезі тіла. Якщо ви користуєтесь, @"document.all[0].innerHTML"
ви отримаєте як голову, так і тіло. Що ще не є повним вмістом UIWebView, оскільки він не поверне теги! Doctype або html, але він набагато ближче.
(Xcode 5 iOS 7) Приклад універсального додатка для iOS 7 та Xcode 5. Це проект / приклад з відкритим кодом, що знаходиться тут: Посилання на SimpleWebView (приклад Zip проекту та вихідний код)
отримати HTML від UIWebView`
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")
встановити HTML в UIWebView
//Do not forget to extend a class from `UIWebViewDelegate` and nil the delegate
func someFunction() {
let uiWebView = UIWebView()
uiWebView.loadHTMLString("<html><body></body></html>", baseURL: nil)
uiWebView.delegate = self as? UIWebViewDelegate
}
func webViewDidFinishLoad(_ webView: UIWebView) {
//ready to be processed
}