Bir web sayfasına yüklenmiş olan ham HTML içeriğini okumak mümkün müdür UIWebView
?
Değilse, iPhone SDK'daki bir web sayfasından ham HTML içeriğini çekmenin başka bir yolu var mı (.NET'in eşdeğeri gibi WebClient::openRead
)?
Bir web sayfasına yüklenmiş olan ham HTML içeriğini okumak mümkün müdür UIWebView
?
Değilse, iPhone SDK'daki bir web sayfasından ham HTML içeriğini çekmenin başka bir yolu var mı (.NET'in eşdeğeri gibi WebClient::openRead
)?
Yanıtlar:
İkinci soruyu cevaplamak aslında daha kolay. stringWithContentsOfURL:encoding:error:
NSString yöntemine bakın - bir URL'yi bir NSURL örneği olarak (NSString'den kolayca örneklenebilir) geçirmenize izin verir ve bu URL'de sayfanın tüm içeriğini içeren bir dize döndürür. Örneğin:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
Bu kodu çalıştırdıktan sonra, googlePage
www.google.com için HTML içerecek ve getirmede error
karşılaşılan tüm hataları içerecektir. ( error
Getirme işleminden sonra içeriğini kontrol etmelisiniz .)
Diğer yöne gitmek (bir UIWebView'dan) biraz daha zordur, ancak temelde aynı kavramdır. İsteği görünümden çekmeniz , ardından getirmeyi daha önce yaptığınız gibi yapmanız gerekir:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
DÜZENLEME: Her iki yöntem de, isteği iki kez yaptıkları için performans açısından bir darbe alır. Şu anda yüklü olan UIWebView içeriğini stringByEvaluatingJavascriptFromString:
yöntemini kullanarak alarak bu sorunu aşabilirsiniz , örneğin:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
Bu, Belge Nesne Modelini kullanarak görünümün mevcut HTML içeriğini alır, JavaScript'i ayrıştırır ve sonra bunu size HTML'nin NSString'i * olarak verir.
Başka bir yol da, isteğinizi önce programlı olarak yapmak, ardından UIWebView'ı istediğinizden yüklemektir. Diyelim ki NSString *page
, bir çağrının sonucu olarak sahip olduğunuz yukarıdaki ikinci örneği ele alalım stringWithContentsOfURL:encoding:error:
. Daha sonra loadHTMLString:baseURL:
, talep ettiğiniz NSURL'yi de elinde tuttuğunuzu varsayarak, bu dizeyi kullanarak web görünümüne itebilirsiniz:
[yourWebView loadHTMLString:page baseURL:requestURL];
Bununla birlikte, bunun yüklediğiniz sayfada bulunan JavaScript'i çalıştırıp çalıştırmayacağından emin değilim (yöntem adı, loadHTMLString
biraz belirsizdir ve dokümanlar bu konuda pek bir şey söylemez).
Daha fazla bilgi için:
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
benim için birkaç kez cankurtaran oldu. Belgeden olabildiğince geri dönüyor gibi görünüyor.
Zaten yüklenmiş bir UIWebView içeriğini çıkarmak istiyorsanız, -stringByEvaluatingJavaScriptFromString. Örneğin:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
NSString stringWithContentsOfURL'nin, aynı isteği yapan UIWebView'dan tamamen farklı bir kullanıcı aracısı dizesi rapor edeceğini unutmayın. Dolayısıyla, sunucunuz kullanıcı aracısının farkındaysa ve bunu kimin istediğine bağlı olarak farklı html'leri geri gönderiyorsa, bu şekilde doğru sonuçları alamayabilirsiniz.
Ayrıca @"document.body.innerHTML"
yukarıda belirtilenin yalnızca gövde etiketinde olanı göstereceğini unutmayın . Eğer kullanırsanız @"document.all[0].innerHTML"
size baş ve vücudu hem alacak. Bu,! Doctype veya html etiketlerini geri alamayacağından, UIWebView'ın tam içeriği değildir, ancak çok daha yakındır.
(Xcode 5 iOS 7) iOS 7 ve Xcode 5 için Evrensel Uygulama örneği Burada bulunan açık kaynaklı bir proje / örnektir: SimpleWebView'a Bağlantı (Proje Zip ve Kaynak Kodu Örneği)
UIWebView'dan HTML alın`
let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")
HTML'yi UIWebView'a ayarla
//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
}