UIWebView'dan HTML içeriğini okuma


132

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:


216

İ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, googlePagewww.google.com için HTML içerecek ve getirmede errorkarşılaşılan tüm hataları içerecektir. ( errorGetirme 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ı, loadHTMLStringbiraz belirsizdir ve dokümanlar bu konuda pek bir şey söylemez).

Daha fazla bilgi için:


1
Müthiş! Harika cevap için teşekkürler. Her iki yöntemin de sayfanın iki kez yüklenmesiyle sonuçlandığını ve bunun performansı etkileyebileceğini varsayıyorum. Bundan kaçınmanın bir yolu var mı?
Fuzzy Purple Monkey

2
Nitekim var :) Cevap düzeltildi.
Tim

1
Evet, [yourWebView loadHTMLString: page baseURL: requestURL]; Javascript'i sayfada çalıştıracaktır. Bu API'yi Google haritalar ile kullandım.
jeff7091

3
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.
ennalax

2
@Hanuman Bu size yardımcı olabilir: NSString * head = [yourWebView stringByEvaluatingJavaScriptFromString: @ "document.head.innerHTML"]; NSString * body = [yourWebView stringByEvaluatingJavaScriptFromString: @ "document.body.innerHTML"]; NSString * totalPage = her iki dizeyi de ekler.
Deepukjayan

91

Zaten yüklenmiş bir UIWebView içeriğini çıkarmak istiyorsanız, -stringByEvaluatingJavaScriptFromString. Örneğin:

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

10
Kahretsin, bu akıllıca!
jemmons

2
Aklıma gelen soru, içerik bir JSON dizesi veya hatta gövde etiketi olmayan bir ham dize olursa ne olacağıdır?
stephenmuss

Bu sağlıklı bir çözüm değil! Tüm javascript kodu ve başlık bilgileri bu şekilde kaybolur.
Radu Simionescu

43

Tüm HTML ham verilerini ( <head>ve ile <body>) almak için:

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

29

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.


Teorik olarak, sen olabilir sunucudan istemek suretiyle Doctype'ı olsun. Doküman türünün kullanıcı aracısına göre değişmeyeceği muhtemeldir.
Moshe

20

Okumak:-

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

Düzenlemek:-

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

2

Swift v3'te:

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


1

Bunun gibi hızlı bir uzantı kullanıyorum:

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

}


1

UIWebView

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
}

[WKWebView'dan HTML al / ayarla]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.