কোনও ইউআইওউবভিউ থেকে এইচটিএমএল সামগ্রী পড়া Read


132

একটি ওয়েব পৃষ্ঠায় কাঁচা এইচটিএমএল বিষয়বস্তু পড়া কি সম্ভব UIWebView?

যদি তা না হয় তবে আইফোন এসডিকে (যেমন। নেট এর সমতুল্য WebClient::openRead) কোনও ওয়েব পৃষ্ঠা থেকে কাঁচা এইচটিএমএল বিষয়বস্তু টানানোর আর কোনও উপায় আছে ?

উত্তর:


216

দ্বিতীয় প্রশ্নের উত্তর দেওয়া সহজতর। stringWithContentsOfURL:encoding:error:এনএসএসটিংয়ের পদ্ধতিটি দেখুন - এটি আপনাকে এনএসআরএল (যা সহজেই এনএসএসটিং থেকে সহজেই ইনস্ট্যান্ট করা যায়) হিসাবে একটি ইউআরএল পাস করতে দেয় এবং সেই 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- এর জন্য এইচটিএমএল errorথাকবে এবং এতে আনতে কোনও ত্রুটি থাকবে। ( errorআনার পরে আপনার সামগ্রীগুলি পরীক্ষা করা উচিত ))

অন্য পথে যেতে (কোনও ইউআইবিউবভিউ থেকে) কিছুটা কৌশলযুক্ত তবে মূলত একই ধারণা। আপনাকে ভিউ থেকে অনুরোধটি টানতে হবে , তারপরে আগের মতো আনতে হবে:

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"];

এটি ডকুমেন্ট অবজেক্ট মডেল ব্যবহার করে ভিউটির বর্তমান এইচটিএমএল সামগ্রীগুলি দখল করবে, জাভাস্ক্রিপ্টটিকে বিশ্লেষণ করবে, তারপরে এটি আপনাকে এইচটিএমএল এর এনএসএসআরটিং * হিসাবে দেবে।

আরেকটি উপায় হ'ল প্রথমে আপনার অনুরোধটি প্রোগ্রাম্যাটিকভাবে করা, তারপরে আপনি যা অনুরোধ করেছিলেন তা থেকে ইউআইবিউবভিউ লোড করুন। ধরা যাক আপনি উপরের দ্বিতীয় উদাহরণটি গ্রহণ করেছেন, যেখানে NSString *pageকল করার ফলস্বরূপ আপনার কাছে রয়েছে stringWithContentsOfURL:encoding:error:। তারপরে আপনি সেই স্ট্রিংটি ওয়েব ভিউতে loadHTMLString:baseURL:ঠেকাতে পারেন, ধরে নিবেন আপনি যে অনুরোধ করেছিলেন এনএসআরএল ধরে রেখেছেন:

[yourWebView loadHTMLString:page baseURL:requestURL];

তবে আমি নিশ্চিত নই, তবে এটি আপনার লোড করা পৃষ্ঠায় পাওয়া জাভাস্ক্রিপ্টটি চালিত হবে (পদ্ধতিটির নাম, loadHTMLStringকিছুটা দ্বিধাবিভক্ত, এবং ডক্স এটি সম্পর্কে বেশি কিছু বলে না)।

আরও তথ্যের জন্য:


1
অসাধারণ! দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আমি অনুমান করি যে উভয় পদ্ধতির ফলস্বরূপ পৃষ্ঠাটি দু'বার লোড হচ্ছে, যার পারফরম্যান্সের প্রভাব থাকতে পারে। এড়াতে কি উপায় আছে?
অস্পষ্ট বেগুনি বানর

2
প্রকৃতপক্ষে, সম্পাদিত উত্তরগুলি রয়েছে।
টিম

1
হ্যাঁ, [আপনার ওয়েবভিউ লোড এইচটিএমএল স্ট্রিং: পৃষ্ঠা বেসলাইআর: অনুরোধ URL]; পৃষ্ঠায় জাভাস্ক্রিপ্ট চালানো হবে। আমি গুগল মানচিত্রের সাথে এই এপিআই ব্যবহার করেছি।
jeff7091

3
NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];আমার জন্য এখন বেশ কয়েকবার জীবন রক্ষাকারী হয়েছে। এটি যতটা সম্ভব নথি থেকে ফিরে আসবে বলে মনে হচ্ছে।
ennalax

2
@ হনুমান এটি আপনাকে সহায়তা করতে পারে: এনএসএসটিং * হেড = [আপনার ওয়েবভিউ স্ট্রিংবাইআলভ্যাটিং জাভা স্ক্রিপ্টফ্র্যামস্ট্রিং: @ "ডকুমেন্ট.হেড.ইন.টি.এম.এইচটিএমএল]]; এনএসএসটিং * বডি = [আপনার ওয়েবভিউ স্ট্রিংবাইয়েভালুটিং জাভা স্ক্রিপ্টফ্রস্ট্রিং: @ "ডকুমেন্ট.বডি.ইন.ইন.টি.এম.এল"]; এনএসএসটিং * টোটাল পেজ = উভয় স্ট্রিং যুক্ত করুন।
দীপুকজায়ান

91

আপনি যদি ইতিমধ্যে-লোড হওয়া UIWebView, স্ট্রিংবাইয়েওয়ালুয়েটিং জাভা স্ক্রিপ্টফ্রস্ট্রিংয়ের সামগ্রীগুলি বের করতে চান। উদাহরণ স্বরূপ:

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

10
অভিশাপ, এতো চালাক!
জেমনস

2
আমার কাছে প্রশ্নটি হল যদি লিখিত সামগ্রীটি কোনও JSON স্ট্রিং বা বডি ট্যাগ ছাড়াই কোনও কাঁচা স্ট্রিং হয়ে থাকে তবে কী হবে?
স্টেফেনমাস

এটি স্বাস্থ্যকর সমাধান নয়! সমস্ত জাভাস্ক্রিপ্ট কোড এবং শিরোনামের তথ্য এইভাবে হারিয়ে গেছে।
রাদু সিমিনেস্কু

43

পুরো এইচটিএমএল কাঁচা ডেটা পেতে ( <head>এবং এর সাথে <body>):

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

29

মনে রাখবেন যে NSString স্ট্রিংউইথ কনটেন্টস ওউফআরএল একই অনুরোধটি করে UIWebView এর চেয়ে সম্পূর্ণ আলাদা ব্যবহারকারী-এজেন্ট স্ট্রিংয়ের প্রতিবেদন করবে। সুতরাং যদি আপনার সার্ভারটি ব্যবহারকারী-এজেন্ট সচেতন এবং কে এটি জিজ্ঞাসা করছে তার উপর নির্ভর করে বিভিন্ন এইচটিএমএল ফেরত পাঠাচ্ছে, আপনি এইভাবে সঠিক ফলাফল পেতে পারেন না।

এছাড়াও নোট করুন যে @"document.body.innerHTML"উপরে বর্ণিতগুলি কেবল বডি ট্যাগের মধ্যে প্রদর্শিত হবে। আপনি যদি ব্যবহার করেন তবে আপনি @"document.all[0].innerHTML"মাথা এবং শরীর উভয়ই পাবেন। যা এখনও ইউআইউইউভিউ ভিউয়ের সম্পূর্ণ বিষয়বস্তু নয়, যেহেতু এটি! ডক্টাইপ বা এইচটিএমএল ট্যাগগুলি ফিরে পাবে না, তবে এটি অনেক বেশি কাছাকাছি।


তাত্ত্বিকভাবে, আপনি সার্ভার থেকে এটি অনুরোধ করে ডক্টিপ পেতে পারেন । সম্ভবত এটি ইউজ্রেজেন্টের ভিত্তিতে ডকটাইপটি পরিবর্তন হবে না।
মোশে

20

পড়তে:-

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

পরিবর্তন করার:-

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

2

সুইফ্ট ভি 3 তে:

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

1

(এক্সকোড 5 আইওএস 7) আইওএস 7 এবং এক্সকোড 5 এর জন্য ইউনিভার্সাল অ্যাপ উদাহরণ It এটি একটি মুক্ত উত্স প্রকল্প / উদাহরণ এখানে অবস্থিত: সিম্পিওয়েভভিউয়ের লিঙ্ক (প্রকল্প জিপ এবং উত্স কোড উদাহরণ)


1

আমি এটির মতো একটি দ্রুত এক্সটেনশন ব্যবহার করি:

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

}

1

আপনার এটি চেষ্টা করা উচিত:

document.documentElement.outerHTML

1

UIWebView

ইউআইওয়েবভিউ` থেকে এইচটিএমএল পান `

let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")

ইউআইওয়েবভিউতে এইচটিএমএল সেট করুন

//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
}

[ডাব্লুকেউভিউ ভিউ থেকে HTML পান / সেট করুন]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.