শীর্ষস্থানীয় জাভা এইচটিএমএল পার্সারদের পক্ষে কি কি? [বন্ধ]


175

SO এবং গুগল অনুসন্ধান করে, আমি খুঁজে পেয়েছি যে কয়েকটি জাভা এইচটিএমএল পার্সার রয়েছে যা নিয়মিতভাবে বিভিন্ন পক্ষের দ্বারা সুপারিশ করা হয়। দুর্ভাগ্যক্রমে বিভিন্ন লাইব্রেরির শক্তি এবং দুর্বলতার কোনও তথ্য খুঁজে পাওয়া শক্ত। আমি আশা করছি যে কিছু লোক এই গ্রন্থাগারগুলির সাথে তুলনা করে কিছু ব্যয় করেছেন, এবং তারা যা শিখেছে তা ভাগ করে নিতে পারে।

আমি যা দেখেছি তা এখানে:

এবং যদি আমি এখানে থাকা কোনও বড় বিশ্লেষককে মিস করেছি তবে আমি এর ভালতা এবং কৌশলগুলি সম্পর্কেও শুনতে পছন্দ করব।

ধন্যবাদ!

উত্তর:


223

সাধারণ

প্রায় সকল জ্ঞাত এইচটিএমএল পার্সারগুলি ডাব্লু 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়তা (এটি কতবার আপডেট / রক্ষণাবেক্ষণ / স্থির হয়)? )। আপনি যদি এইচটিএমএল পরীক্ষা করতে চান, তবে এইচটিএমএলইনাইট হ'ল উপায়। আপনি যদি এইচটিএমএল থেকে নির্দিষ্ট ডেটা বের করতে চান (যা প্রায়শই আসল বিশ্বের প্রয়োজনের চেয়ে বেশি হয়), তবে জাসুপই যাওয়ার উপায়।


এখানে একটি বিশাল সমর্থক / কন রয়েছে যা এখানে বাদ দেওয়া হয়েছে: জেরিকো হ'ল একমাত্র পার্সার আমি জানি যে শ্বেত স্পেস ফর্ম্যাটিং এবং এইচটিএমএলের ভুল (যদি থাকে তবে) সংরক্ষণ করার সময় আপনাকে দুষ্টু এইচটিএমএল ম্যানিপুলেট করতে দেয়।
অ্যাডাম জেন্ট

3
Jsoupভাল. আমি org.w3c.dom.*এপিআই এর সাথে কাজ করে এমন অন্য মডিউলের সাথে এটি ইন্টারফেস করার চেষ্টা করেছি । পাওয়া যে Jsoup পালন না করে সে org.w3c.dom.*চুক্তি
Thamme গৌড়া

13

এই নিবন্ধটি নিম্নলিখিত পার্সারগুলির কয়েকটি দিকের তুলনা করেছে:

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

এটি কোনওভাবেই পুরো সংক্ষিপ্তসার নয় এবং এটি ২০০৮ সালের But


এটি একটি লিঙ্ক-কেবল উত্তর। আপনি এখানে প্রাসঙ্গিক বিবরণ যুক্ত করতে পারেন?
মনিকা পুনরায় ইনস্টল করুন - notmaynard

7

আপনার তালিকার মধ্যে জাভাতে HTML5 পার্সিং অ্যালগরিদমের একটি বাস্তবায়নকারী, বৈধকারী.নু এইচটিএমএল পার্সার যুক্ত করুন ।

প্লাস সাইডে, এটি বিশেষত এইচটিএমএল 5 এর সাথে মিলিয়ে ডিজাইন করা হয়েছে এবং এইচটিএমএল 5 যাচাইকারীর কেন্দ্রে, যাতে ভবিষ্যতের ব্রাউজারের পার্সিং আচরণটি খুব উচ্চ মাত্রার যথার্থতার সাথে মেলে highly

বিয়োগের দিকে, কোনও ব্রাউজারের লিগ্যাসি পার্সিং ঠিক ঠিক এইভাবে কাজ করে না এবং HTML5 এখনও খসড়াতে রয়েছে, পরিবর্তিত হতে পারে।

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


7

আমি জেরিকো এইচটিএমএল পার্সারকে খুব ভালভাবে লিখিত, আপ টু ডেট (যা অনেক পার্সার নয়), কোনও নির্ভরতা এবং ব্যবহার সহজ to


6

আমি জাভাতে বেশিরভাগ এইচটিএমএল পার্সিং লাইব্রেরির সাথে কাজ করার পরে @ এমজেবি উত্তরে যুক্ত করব, এখানে একটি বিশাল প্রো / কন রয়েছে যা বাদ পড়েছে: পার্সারগুলি যা ইনপুট এবং আউটপুটটিতে এইচটিএমএলের বিন্যাস এবং ভুলতা সংরক্ষণ করে।

এটি সর্বাধিক পার্সার যখন আপনি দস্তাবেজটি পরিবর্তন করেন তখন হোয়াইট স্পেস, মন্তব্য এবং DOM এর ভুলতা দূরে সরিয়ে দেয় বিশেষত যদি তারা লাইব্রেরির মতো এক্সএমএল হয়।

জেরিকো হ'ল একমাত্র পার্সার যা আমি জানি যে শ্বেতস্পেস বিন্যাস এবং এইচটিএমএলের ভুল (যদি সেখানে থাকে) সংরক্ষণ করার সময় আপনাকে দুষ্টু এইচটিএমএল ম্যানিপুলেট করতে দেয়।


3

অন্য দুটি বিকল্প হ'ল এইচটিএমএল ক্লিনার এবং এইচটিএমএল পার্সার

আমি বিকাশকারী ক্রলার / ডেটা নিষ্কাশন কাঠামোর জন্য এখানে বেশিরভাগ পার্সার চেষ্টা করেছি। আমি প্রচুর পরিমাণে ডেটা এক্সট্রাকশন কাজের জন্য এইচটিএমএল ক্লিনার ব্যবহার করি। এটি কারণ যে এটি এইচটিএমএল, এক্সএইচটিএমএল, এইচটিএমএল 5, নামস্পেসিসহ যুক্তিযুক্ত আধুনিক উপভাষাকে সমর্থন করে এবং এটি ডমকে সমর্থন করে, তাই এটি এক্সপ্যাথ বাস্তবায়নে জাভা দ্বারা নির্মিত সঙ্গে এটি ব্যবহার করা সম্ভব ।

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

আমি টেবিল নিষ্কাশন কার্যের জন্য এইচটিএমএল পার্সার এবং জেরিকোও ব্যবহার করি, যা পার্লের লিবিচটিএমএল-টেবিলেক্সট্র্যাক্ট-পার্ল ব্যবহার করে লিখিত কিছু কোড প্রতিস্থাপন করেছে । আমি টেবিলের জন্য এইচটিএমএল ফিল্টার করতে এইচটিএমএল পার্সার ব্যবহার করি, তারপরে পার্স করার জন্য জেরিকো ব্যবহার করি। আমি এমজেবির এবং অ্যাডামের মন্তব্যে একমত যে জেরিকো কিছু ক্ষেত্রে ভাল কারণ এটি অন্তর্নিহিত এইচটিএমএল সংরক্ষণ করে। এটিতে এক ধরণের অ-মানক SAX ইন্টারফেস রয়েছে, তাই এক্সপথ প্রসেসিংয়ের জন্য এইচটিএমএল ক্লিনার ভাল।

জাভাতে এইচটিএমএল পার্স করা একটি আশ্চর্যজনকরকম সমস্যা কারণ সমস্ত পার্সাররা নির্দিষ্ট ধরণের ত্রুটিযুক্ত এইচটিএমএল সামগ্রীতে লড়াই করে বলে মনে হচ্ছে।

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