সাধারণ
প্রায় সকল জ্ঞাত এইচটিএমএল পার্সারগুলি ডাব্লু 3 সি ডোম এপিআই প্রয়োগ করে (জ্যাকএক্সপি এপিআই এর অংশ, এক্সএমএল প্রসেসিংয়ের জন্য জাভা এপিআই) এবং আপনাকে এমন একটি org.w3c.dom.Document
ব্যাক দেয় যা জ্যাকসপি এপিআই দ্বারা সরাসরি ব্যবহারের জন্য প্রস্তুত। প্রধান পার্থক্যগুলি সাধারণত প্রশ্নযুক্ত পার্সারের বৈশিষ্ট্যগুলিতে পাওয়া যায়। বেশিরভাগ পার্সার হ'ল জেটিডি , নেকোএইচটিএমএল , ট্যাগসুপ এবং এইচটিএমএল ক্লিনারের মতো অ-সুস্পষ্ট HTML ("ট্যাগসুপ") সহ একটি নির্দিষ্ট ডিগ্রী ক্ষমাশীল এবং লেনিয়েন্ট । আপনি এইচটিএমএল পার্সার সাধারণত এইচটিএমএল উত্সকে "পরিপাটি" করতে ব্যবহার করেন (উদাহরণস্বরূপ, <br>
এক্সএমএল-বৈধ দ্বারা এইচটিএমএল-বৈধ প্রতিস্থাপন)<br />
), যাতে আপনি ডাব্লু 3 সি ডোম এবং জ্যাকসপি এপিআই ব্যবহার করে এটি "স্বাভাবিক পথে" অতিক্রম করতে পারেন।
কেবলমাত্র এইচটিএমএলউনিত এবং জসুপই লাফিয়ে চলেছে ।
HtmlUnit
এইচটিএমএলউইন্ট একটি সম্পূর্ণ নিজস্ব এপিআই সরবরাহ করে যা আপনাকে ওয়েব ব্রাউজারের মতো প্রোগ্রামের মতো কাজ করার সম্ভাবনা দেয়। অর্থাৎ ফর্মের মানগুলি লিখুন, উপাদানগুলিতে ক্লিক করুন, জাভাস্ক্রিপ্টের আবেদন করুন, ইত্যাদি। এটি এইচটিএমএল পার্সারের একার চেয়ে অনেক বেশি। এটি একটি আসল "জিইউআই-কম ওয়েব ব্রাউজার" এবং এইচটিএমএল ইউনিট পরীক্ষার সরঞ্জাম।
Jsoup
জাসাপ সম্পূর্ণ নিজস্ব এপিআই সরবরাহ করে। এটি আপনাকে jQuery- মত CSS সিলেক্টর ব্যবহার করে উপাদান নির্বাচন করার সম্ভাবনা দেয় এবং আগ্রহের উপাদানগুলি পেতে এইচটিএমএল ডিওএম ট্রিকে অতিক্রম করার জন্য একটি স্লিক এপিআই সরবরাহ করে।
বিশেষত এইচটিএমএল ডিওএম গাছের সন্ধান করা জাসপের প্রধান শক্তি। যারা কাজ করেছেন তারা org.w3c.dom.Document
জানেন যে ভার্বোজ NodeList
এবং Node
এপিআই ব্যবহার করে ডিওএমকে অতিক্রম করা কী বেদনাদায়ক । এটা ঠিক যে,XPath
জীবনকে সহজ করে তোলে তবে তবুও এটি আরেকটি শেখার বক্ররেখা এবং এটি স্থির হয়ে যায়।
আপনার উদাহরণের প্রথম অনুচ্ছেদ এবং সমস্ত উত্তরদাতাদের নাম বের করার জন্য এক্সপিথের সাথে একত্রে "প্লেইন" ডাব্লু 3 সি ডোম পার্সার ব্যবহার করে এমন এক উদাহরণ যা আমি এক্সপ্যাথটি ব্যবহার করছি কারণ এটি ছাড়াই কোডটি আগ্রহের তথ্য সংগ্রহ করার জন্য প্রয়োজনীয় ছিল অন্যথায় ইউটিলিটি / সহায়ক পদ্ধতি না লিখে 10 গুণ বড় হবে।
String url = "http://stackoverflow.com/questions/3152138";
Document document = new Tidy().parseDOM(new URL(url).openStream(), null);
XPath xpath = XPathFactory.newInstance().newXPath();
Node question = (Node) xpath.compile("//*[@id='question']//*[contains(@class,'post-text')]//p[1]").evaluate(document, XPathConstants.NODE);
System.out.println("Question: " + question.getFirstChild().getNodeValue());
NodeList answerers = (NodeList) xpath.compile("//*[@id='answers']//*[contains(@class,'user-details')]//a[1]").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < answerers.getLength(); i++) {
System.out.println("Answerer: " + answerers.item(i).getFirstChild().getNodeValue());
}
এবং এখানে জসুপের সাথে ঠিক কীভাবে করা যায় তার একটি উদাহরণ:
String url = "http://stackoverflow.com/questions/3152138";
Document document = Jsoup.connect(url).get();
Element question = document.select("#question .post-text p").first();
System.out.println("Question: " + question.text());
Elements answerers = document.select("#answers .user-details a");
for (Element answerer : answerers) {
System.out.println("Answerer: " + answerer.text());
}
আপনি পার্থক্য দেখতে পান কি? এটি কেবলমাত্র কম কোড নয়, তবে সিএসএস নির্বাচকদের সাথে আপনার ইতিমধ্যে মধ্যপন্থী অভিজ্ঞতা থাকলে (উদাহরণস্বরূপ ওয়েবসাইটগুলি বিকাশ এবং / অথবা jQuery ব্যবহার করে) জাসুপ সহজেই উপলব্ধি করা সহজ।
সারসংক্ষেপ
প্রত্যেকের উপকারিতা এবং কনসগুলি এখন যথেষ্ট পরিষ্কার হওয়া উচিত। আপনি যদি এটি অনুসরণ করতে কেবল স্ট্যান্ডার্ড JAXP এপিআই ব্যবহার করতে চান, তবে পার্সারগুলির প্রথম উল্লিখিত গোষ্ঠীর জন্য যান। সেখানে সুন্দর অনেক তাদের। কোনটি চয়ন করবেন তা প্রদত্ত বৈশিষ্ট্যগুলির উপর নির্ভর করে (এইচটিএমএল পরিষ্কার কীভাবে আপনার পক্ষে সহজ হয়? এখানে কিছু শ্রোতা / ইন্টারসেপ্টর এবং ট্যাগ-নির্দিষ্ট ক্লিনার রয়েছে?) এবং লাইব্রেরির দৃust়তা (এটি কতবার আপডেট / রক্ষণাবেক্ষণ / স্থির হয়)? )। আপনি যদি এইচটিএমএল পরীক্ষা করতে চান, তবে এইচটিএমএলইনাইট হ'ল উপায়। আপনি যদি এইচটিএমএল থেকে নির্দিষ্ট ডেটা বের করতে চান (যা প্রায়শই আসল বিশ্বের প্রয়োজনের চেয়ে বেশি হয়), তবে জাসুপই যাওয়ার উপায়।