Чтение содержимого HTML из UIWebView - PullRequest
128 голосов
/ 14 июня 2009

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

Если нет, есть ли другой способ извлечь необработанный HTML-контент с веб-страницы в iPhone SDK (например, эквивалент .NET WebClient::openRead)?

Ответы [ 9 ]

211 голосов
/ 14 июня 2009

На второй вопрос проще ответить. Посмотрите на 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, несколько двусмысленно, и документы не говорят об этом много).

Для получения дополнительной информации:

91 голосов
/ 14 июня 2009

, если вы хотите извлечь содержимое уже загруженного UIWebView, -stringByEvaluatingJavaScriptFromString. Например:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
43 голосов
/ 16 апреля 2012

Чтобы получить все необработанные данные HTML (с <head> и <body>):

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
29 голосов
/ 30 ноября 2010

Обратите внимание, что NSString stringWithContentsOfURL сообщит о совершенно иной строке агента пользователя, чем UIWebView, выполняющий тот же запрос. Поэтому, если ваш сервер работает с пользовательским агентом и отправляет разные html-файлы в зависимости от того, кто его запрашивает, вы, возможно, не получите правильные результаты таким образом.

Также обратите внимание, что @"document.body.innerHTML", упомянутый выше, будет отображать только то, что находится в теге body. Если вы используете @"document.all[0].innerHTML", вы получите голову и тело. Что еще не является полным содержимым UIWebView, так как он не вернет теги! Doctype или html, но он намного ближе.

19 голосов
/ 22 октября 2009

Читать: -

NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);    

Для изменения: -

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
2 голосов
/ 10 июня 2017

В Swift v3:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
1 голос
/ 11 июля 2017

Я использую быстрое расширение, как это:

extension UIWebView {
    var htmlContent:String? {
        return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
    }

}
1 голос
/ 14 мая 2014

вы должны попробовать это:

document.documentElement.outerHTML
1 голос
/ 21 января 2014

(Xcode 5 iOS 7) Пример универсального приложения для iOS 7 и Xcode 5. Это проект / пример с открытым исходным кодом, расположенный здесь: Ссылка на SimpleWebView (Пример Zip и исходного кода проекта)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...