क्या वेब पेज के कच्चे एचटीएमएल कंटेंट को पढ़ना संभव है जिसे लोड किया गया है UIWebView
?
यदि नहीं, तो क्या iPhone SDK (जैसे .NET के समतुल्य WebClient::openRead
) के वेब पेज से कच्चे HTML सामग्री को खींचने का एक और तरीका है ?
क्या वेब पेज के कच्चे एचटीएमएल कंटेंट को पढ़ना संभव है जिसे लोड किया गया है UIWebView
?
यदि नहीं, तो क्या iPhone SDK (जैसे .NET के समतुल्य WebClient::openRead
) के वेब पेज से कच्चे HTML सामग्री को खींचने का एक और तरीका है ?
जवाबों:
दूसरा प्रश्न वास्तव में उत्तर देने में आसान है। 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
www.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
कुछ अस्पष्ट है, और डॉक्स इसके बारे में बहुत कुछ नहीं कहते हैं)।
अधिक जानकारी के लिए:
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
अब कई बार मेरे लिए जीवन रक्षक रहा है। ऐसा लगता है कि दस्तावेज़ से जितना संभव हो उतना वापस लौटना चाहिए।
यदि आप पहले से लोड किए गए UIWebView, -stringByEvaluatingJavaScriptFrString की सामग्री निकालना चाहते हैं। उदाहरण के लिए:
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
ध्यान दें कि NSString stringWithContentsOfURL UIWebView के समान अनुरोध करने की तुलना में पूरी तरह से अलग उपयोगकर्ता-एजेंट स्ट्रिंग की रिपोर्ट करेगा। इसलिए यदि आपका सर्वर उपयोगकर्ता-एजेंट के बारे में जानता है, और अलग-अलग HTML भेज रहा है, तो इस बात पर निर्भर करता है कि आप किससे पूछ रहे हैं, इस तरह से आपको सही परिणाम नहीं मिलेंगे।
यह भी ध्यान दें कि @"document.body.innerHTML"
ऊपर उल्लिखित केवल वही प्रदर्शित करेगा जो बॉडी टैग में है। यदि आप उपयोग करते हैं @"document.all[0].innerHTML"
तो आपको सिर और शरीर दोनों मिलेंगे। जो अभी भी UIWebView की पूरी सामग्री नहीं है, क्योंकि यह वापस! Doctype या html टैग नहीं मिलेगा, लेकिन यह बहुत करीब है।
(Xcode 5 iOS 7) iOS 7 और Xcode 5 के लिए यूनिवर्सल ऐप उदाहरण। यह एक ओपन सोर्स प्रोजेक्ट / उदाहरण है जो यहां स्थित है: Link to SimpleWebView (प्रोजेक्ट ज़िप और सोर्स कोड उदाहरण)
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
}