Чтение содержимого HTML из UIWebView

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

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

Ответ 1

На второй вопрос на самом деле легче ответить. Посмотрите на 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: эту строку в веб-представление, используя loadHTMLString:baseURL: предполагая, что вы также держитесь за NSURL, который вы запрашивали:

[yourWebView loadHTMLString:page baseURL:requestURL];

Однако я не уверен, будет ли запускаться JavaScript, найденный на загружаемой странице (имя метода loadHTMLString несколько неоднозначно, и в документах об этом много не говорится).

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

Ответ 2

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

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];

Ответ 3

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

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];

Ответ 4

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

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

Ответ 5

Считать: -

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

Чтобы изменить: -

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

Ответ 6

В Swift v3:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")

Ответ 8

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

document.documentElement.outerHTML

Ответ 9

Я использую быстрое расширение следующим образом:

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

}