Чтение содержимого HTML из UIWebView
Можно ли прочитать необработанный HTML-контент веб-страницы, которая была загружена в UIWebView
?
Если нет, есть ли другой способ извлечь необработанный HTML-контент с веб-страницы в iPhone SDK (например, эквивалент.NET WebClient::openRead
)?
9 ответов
На второй вопрос на самом деле легче ответить. Посмотрите на 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];
РЕДАКТИРОВАТЬ: Оба эти метода, однако, наносят удар по производительности, так как они делают запрос дважды. Вы можете обойти это, захватывая контент из загруженного в настоящее время 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
, несколько двусмысленно, и документы не много говорят об этом).
Для получения дополнительной информации:
Если вы хотите извлечь содержимое уже загруженного UIWebView, -stringByEvaluatingJavaScriptFromString. Например:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
Чтобы получить все необработанные данные HTML (с <head>
а также <body>
):
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
Обратите внимание, что NSString stringWithContentsOfURL сообщит о совершенно другой строке агента пользователя, чем UIWebView, выполняющий тот же запрос. Поэтому, если ваш сервер работает с пользовательским агентом и отправляет разные html-файлы в зависимости от того, кто его запрашивает, вы можете не получить правильные результаты таким образом.
Также обратите внимание, что @"document.body.innerHTML"
упомянутое выше покажет только то, что находится в теге body. Если вы используете @"document.all[0].innerHTML"
вы получите и голову, и тело. Что еще не является полным содержимым UIWebView, так как он не вернет теги! Doctype или html, но он намного ближе.
Читать:-
NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);
Модифицировать:-
html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
В Swift v3:
let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
(Xcode 5 iOS 7) Пример универсального приложения для iOS 7 и Xcode 5. Это проект / пример с открытым исходным кодом, расположенный здесь: Ссылка на SimpleWebView (Пример Zip и исходного кода проекта)
Я использую быстрое расширение, как это:
extension UIWebView {
var htmlContent:String? {
return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
}
}
Еще один пример
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")
получить HTML из WKWebView
положить HTML в UIWebView
положить HTML в WKWebView