UIWebView से HTML सामग्री पढ़ना


132

क्या वेब पेज के कच्चे एचटीएमएल कंटेंट को पढ़ना संभव है जिसे लोड किया गया है UIWebView?

यदि नहीं, तो क्या iPhone SDK (जैसे .NET के समतुल्य WebClient::openRead) के वेब पेज से कच्चे HTML सामग्री को खींचने का एक और तरीका है ?

जवाबों:


216

दूसरा प्रश्न वास्तव में उत्तर देने में आसान है। 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];

इस कोड को चलाने के बाद, googlePagewww.google.com के लिए HTML errorहोगा , और इसमें किसी भी प्रकार की त्रुटि होगी। (आपको भ्रूण के errorबाद की सामग्री की जांच करनी चाहिए ।)

दूसरे तरीके से जाना (UIWebView से) थोड़ा मुश्किल है, लेकिन मूल रूप से एक ही अवधारणा है। आपको दृश्य से अनुरोध को खींचना होगा , फिर पहले की तरह प्राप्त करें:

NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&error];

संपादित करें: ये दोनों विधियाँ एक प्रदर्शन हिट लेती हैं, हालाँकि, जब से वे दो बार अनुरोध करते हैं। आप इसकी stringByEvaluatingJavascriptFromString:विधि का उपयोग करके वर्तमान में भरी हुई UIWebView की सामग्री को हथियाने के द्वारा इसे प्राप्त कर सकते हैं , जैसे:

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

यह डॉक्यूमेंट ऑब्जेक्ट मॉडल का उपयोग करके दृश्य की वर्तमान HTML सामग्री को ले जाएगा, जावास्क्रिप्ट को पार्स करेगा, फिर इसे आपको HTML के NSString * के रूप में देगा।

दूसरा तरीका यह है कि आप अपने अनुरोध को पहले प्रोग्राम करें, फिर UIWebView को आपके अनुरोध के अनुसार लोड करें। मान लें कि आप ऊपर दूसरा उदाहरण लेते हैं, जहां आपको NSString *pageकॉल करने का परिणाम है stringWithContentsOfURL:encoding:error:। फिर आप उस स्ट्रिंग को वेब दृश्य में उपयोग कर धक्का दे सकते हैं loadHTMLString:baseURL:, यह मानते हुए कि आपने अनुरोध किए गए NSURL पर भी कब्जा कर लिया है:

[yourWebView loadHTMLString:page baseURL:requestURL];

मुझे यकीन नहीं है, हालांकि, अगर यह आपके द्वारा लोड किए गए पृष्ठ में पाया गया जावास्क्रिप्ट को चलाएगा (विधि का नाम, loadHTMLStringकुछ अस्पष्ट है, और डॉक्स इसके बारे में बहुत कुछ नहीं कहते हैं)।

अधिक जानकारी के लिए:

  • UIWebView वर्ग संदर्भ
  • NSString वर्ग संदर्भ
  • NSURL वर्ग संदर्भ

1
बहुत बढ़िया! महान जवाब के लिए धन्यवाद। मुझे लगता है कि दोनों विधियों का परिणाम पृष्ठ पर दो बार लोड हो रहा है, जिसका प्रदर्शन प्रभाव हो सकता है। क्या इससे बचने का कोई तरीका है?
फजी पर्पल मंकी

2
तथ्य की बात के रूप में, :) संपादित उत्तर हैं।
टिम

1
हां, [yourWebView loadHTMLString: पृष्ठ आधार: अनुरोध]; पेज में जावास्क्रिप्ट चलाएगा। मैंने Google नक्शे के साथ इस एपीआई का उपयोग किया है।
jeff7091

3
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];अब कई बार मेरे लिए जीवन रक्षक रहा है। ऐसा लगता है कि दस्तावेज़ से जितना संभव हो उतना वापस लौटना चाहिए।
ennalax

2
@ हनुमान यह आपकी मदद कर सकता है: NSString * सिर = [yourWebView stringByEvaluatingJavaScriptFromString: @ "document.head.innerHTML"]; NSString * body = [yourWebView stringByEvaluatingJavaScriptFromString: @ "document.body.innerHTML"]; NSString * totalPage = दोनों स्ट्रिंग्स को जोड़ें।
दीपुकजायण

91

यदि आप पहले से लोड किए गए UIWebView, -stringByEvaluatingJavaScriptFrString की सामग्री निकालना चाहते हैं। उदाहरण के लिए:

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

10
धिक्कार है, चतुर!
जेमोंस

2
मेरे पास सवाल यह है कि क्या होता है यदि सामग्री जेएसएन स्ट्रिंग या बॉडी टैग के बिना भी एक कच्ची स्ट्रिंग होती है?
स्टीफनमुस

यह एक स्वस्थ समाधान नहीं है! सभी जावास्क्रिप्ट कोड और हेडर जानकारी इस तरह खो जाती है।
राडू सिमियोनेस्कु

43

संपूर्ण HTML कच्चे डेटा ( <head>और <body>) प्राप्त करने के लिए :

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

29

ध्यान दें कि NSString stringWithContentsOfURL UIWebView के समान अनुरोध करने की तुलना में पूरी तरह से अलग उपयोगकर्ता-एजेंट स्ट्रिंग की रिपोर्ट करेगा। इसलिए यदि आपका सर्वर उपयोगकर्ता-एजेंट के बारे में जानता है, और अलग-अलग HTML भेज रहा है, तो इस बात पर निर्भर करता है कि आप किससे पूछ रहे हैं, इस तरह से आपको सही परिणाम नहीं मिलेंगे।

यह भी ध्यान दें कि @"document.body.innerHTML"ऊपर उल्लिखित केवल वही प्रदर्शित करेगा जो बॉडी टैग में है। यदि आप उपयोग करते हैं @"document.all[0].innerHTML"तो आपको सिर और शरीर दोनों मिलेंगे। जो अभी भी UIWebView की पूरी सामग्री नहीं है, क्योंकि यह वापस! Doctype या html टैग नहीं मिलेगा, लेकिन यह बहुत करीब है।


सैद्धांतिक रूप से, आप सर्वर से अनुरोध करके सिद्धांत प्राप्त कर सकते हैं। यह संभावना है कि doctype useragent के आधार पर परिवर्तित नहीं होगा।
मोशे

20

पढ़ने के लिए:-

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

संशोधित करना:-

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

2

स्विफ्ट v3 में:

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


1

मैं इस तरह एक तेजी से विस्तार का उपयोग करें:

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

}

1

आपको यह कोशिश करनी चाहिए:

document.documentElement.outerHTML

1

UIWebView

UIWebView` से HTML प्राप्त करें

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
}

[WKWebView से HTML प्राप्त / सेट करें]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.