Можно ли прочитать необработанное HTML-содержимое веб-страницы, загруженной в UIWebView
?
Если нет, есть ли другой способ извлечь необработанный HTML-контент с веб-страницы в iPhone SDK (например, эквивалент .NET WebClient::openRead
)?
Можно ли прочитать необработанное HTML-содержимое веб-страницы, загруженной в UIWebView
?
Если нет, есть ли другой способ извлечь необработанный HTML-контент с веб-страницы в iPhone SDK (например, эквивалент .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];
РЕДАКТИРОВАТЬ: оба эти метода снижают производительность, поскольку они выполняют запрос дважды. Вы можете обойти это, захватив контент из загруженного в данный момент 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"];
Обратите внимание, что NSString stringWithContentsOfURL сообщит о совершенно другой строке пользовательского агента, чем UIWebView, выполняющий тот же запрос. Поэтому, если ваш сервер осведомлен о пользовательском агенте и отправляет обратно разные html в зависимости от того, кто его запрашивает, вы можете не получить правильные результаты таким образом.
Также обратите внимание, что @"document.body.innerHTML"
упомянутое выше будет отображать только то, что находится в теге body. При использовании @"document.all[0].innerHTML"
вы получите и голову, и тело. Это все еще не полное содержимое UIWebView, поскольку он не вернет теги! Doctype или html, но это намного ближе.
(Xcode 5 iOS 7) Пример универсального приложения для iOS 7 и Xcode 5. Это проект / пример с открытым исходным кодом, расположенный здесь: Ссылка на SimpleWebView (Project 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
}