अग्रणी जावा HTML पार्सर के पेशेवरों और विपक्ष क्या हैं? [बन्द है]


175

SO और Google को खोजते हुए, मैंने पाया है कि कुछ जावा HTML पार्सर हैं, जो विभिन्न पक्षों द्वारा लगातार सुझाए जाते हैं। दुर्भाग्य से विभिन्न पुस्तकालयों की शक्तियों और कमजोरियों के बारे में कोई जानकारी प्राप्त करना कठिन है। मुझे उम्मीद है कि कुछ लोगों ने इन पुस्तकालयों की तुलना करने में कुछ खर्च किया है, और जो उन्होंने सीखा है उसे साझा कर सकते हैं।

यहाँ मैंने देखा है:

और अगर कोई बड़ा पार्सर है जो मुझे याद नहीं है, तो मैं इसके पेशेवरों और विपक्षों के बारे में सुनना पसंद करूंगा।

धन्यवाद!

जवाबों:


223

सामान्य

लगभग सभी ज्ञात HTML पार्सर W3C DOM API (JAXP API का हिस्सा, XML प्रोसेसिंग के लिए जावा एपीआई) को लागू करता है और आपको एक org.w3c.dom.Documentबैक देता है जो JAXP API द्वारा प्रत्यक्ष उपयोग के लिए तैयार है। प्रमुख अंतर आमतौर पर प्रश्न में पार्सर की विशेषताओं में पाए जाते हैं। अधिकांश पार्सर JTidy , NekoHTML , TagSoup और HtmlCleaner जैसे गैर-विकृत HTML ("टैग्सअप") के साथ कुछ हद तक क्षमाशील और उदार हैं । आप आमतौर पर HTML स्रोत के लिए इस तरह के HTML पार्सर का उपयोग करते हैं (उदाहरण के लिए <br>XML- मान्य द्वारा HTML-मान्य की जगह <br />), ताकि आप W3C DOM और JAXI API का उपयोग करके इसे "सामान्य तरीके" से पार कर सकें।

केवल जो कूदता है वो है HtmlUnit और Jsoup

HtmlUnit

HtmlUnit एक पूरी तरह से एपीआई प्रदान करता है जो आपको प्रोग्रामर की तरह कार्य करने की संभावना देता है। यानी फॉर्म वैल्यू दर्ज करें, एलिमेंट्स पर क्लिक करें, जावास्क्रिप्ट लागू करें, वगैरह। यह अकेले HTML पार्सर से बहुत अधिक है। यह एक वास्तविक "जीयूआई-कम वेबब्रोसर" और एचटीएमएल इकाई परीक्षण उपकरण है।

Jsoup

Jsoup एक पूरी तरह से एपीआई भी प्रदान करता है। यह आपको jQuery की तरह सीएसएस चयनकर्ताओं का उपयोग करने वाले तत्वों का चयन करने की संभावना देता है और ब्याज के तत्वों को प्राप्त करने के लिए HTML DOM ट्री को पार करने के लिए एक चालाक एपीआई प्रदान करता है।

विशेष रूप से HTML DOM ट्री की ट्रैवर्सिंग Jsoup की प्रमुख ताकत है। जिन लोगों ने साथ काम किया है, वे org.w3c.dom.Documentजानते हैं कि वर्बोज़ NodeListऔर Nodeएपीआई का उपयोग करके डोम को पीछे करना कितना दर्दनाक है । सच है, XPathजीवन को आसान बनाता है, लेकिन फिर भी, यह एक और सीखने की अवस्था है और यह अभी भी क्रियात्मक हो सकता है।

यहाँ एक उदाहरण है जो आपके प्रश्न के पहले पैराग्राफ और सभी उत्तरदाताओं के नाम निकालने के लिए XPath के साथ संयोजन में JTidy की तरह एक "सादे" W3C DOM पार्सर का उपयोग करता है (मैं XPath का उपयोग कर रहा हूं क्योंकि इसके बिना, ब्याज की जानकारी इकट्ठा करने के लिए कोड की आवश्यकता है अन्यथा उपयोगिता / सहायक विधियों को लिखे बिना 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());
}

और यहाँ एक उदाहरण है कि कैसे Jsoup के साथ बिल्कुल वैसा ही किया जाए:

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 का उपयोग करके) के साथ मध्यम अनुभव है, तो Jsoup भी अपेक्षाकृत आसान है।

सारांश

प्रत्येक के पक्ष और विपक्ष अब पर्याप्त स्पष्ट होने चाहिए। यदि आप बस इसे पार करने के लिए मानक JAXP एपीआई का उपयोग करना चाहते हैं, तो पार्सर्स के पहले उल्लेखित समूह के लिए जाएं। उनमें से बहुत सारे हैं। कौन सा चुनना है यह उन सुविधाओं पर निर्भर करता है जो प्रदान करता है (HTML सफाई आपके लिए कैसे आसान है? क्या कुछ श्रोता / इंटरसेप्टर और टैग-विशिष्ट क्लीनर हैं?) और पुस्तकालय की मजबूती (यह कितनी बार अद्यतन / रखरखाव / तय किया गया है)? )। यदि आप HTML को यूनिट टेस्ट करना पसंद करते हैं, तो HtmlUnit जाने का रास्ता है। यदि आप HTML से विशिष्ट डेटा निकालना पसंद करते हैं (जो वास्तविक दुनिया की आवश्यकता से अधिक है), तो Jsoup जाने का रास्ता है।


एक बहुत बड़ा प्रो / कोन है जो यहां छोड़ा गया है: जेरिको एकमात्र पार्सर है जो मुझे पता है कि आप व्हाट्सएप फॉर्मेटिंग को संरक्षित करते हुए और HTML की गलतता (अगर कोई है) की अनुमति देते हुए आपको गंदा HTML हेरफेर करने की अनुमति देता है।
एडम गेंट

3
Jsoupअच्छा है। मैंने इसे दूसरे मॉड्यूल के साथ इंटरफेस करने की कोशिश की जो org.w3c.dom.*एपीआई के साथ काम करता है। पाया कि Jsoup org.w3c.dom.*अनुबंध का पालन ​​नहीं करता है
Thamme Gowda

13

यह लेख निम्नलिखित पार्सर्स के कुछ पहलुओं की तुलना करता है:

  • NekoHTML
  • JTidy
  • TagSoup
  • HtmlCleaner

यह किसी भी तरह से पूर्ण सारांश नहीं है, और यह 2008 से है। लेकिन आपको यह मददगार लग सकता है।


यह लिंक-ओनली उत्तर है। क्या आप यहाँ प्रासंगिक विवरण जोड़ सकते हैं?
मोनिका को बहाल करना - notmaynard

7

जावा में HTML5 पार्सिंग एल्गोरिथ्म के कार्यान्वयन के लिए अपनी सूची में validator.nu HTML पार्सर जोड़ें ।

प्लस साइड पर, यह विशेष रूप से एचटीएमएल 5 और एचटीएमएल 5 सत्यापनकर्ता के दिल में मेल करने के लिए डिज़ाइन किया गया है, इसलिए भविष्य के ब्राउज़र के पार्सिंग व्यवहार को बहुत अधिक सटीकता के साथ मिलान करने की संभावना है।

माइनस साइड पर, कोई भी ब्राउज़र की विरासत पार्सिंग बिल्कुल इस तरह से काम नहीं करती है, और जैसा कि HTML5 अभी भी ड्राफ्ट में है, परिवर्तन के अधीन है।

व्यवहार में, ऐसी समस्याएं केवल अस्पष्ट कोने के मामलों को प्रभावित करती हैं, और सभी व्यावहारिक उद्देश्यों के लिए है, एक उत्कृष्ट पार्सर।


7

मैंने पाया कि जेरिको एचटीएमएल पार्सर बहुत अच्छी तरह से लिखा गया है, आज तक रखा गया है (जो कई पार्सर नहीं हैं), कोई निर्भरता नहीं है, और उपयोग करने में आसान है।


6

मैं सिर्फ जावा में अधिकांश HTML पार्सिंग पुस्तकालयों के साथ काम करने के बाद @MJB उत्तर जोड़ूंगा, एक बहुत बड़ा प्रो / कोन है जो छोड़ा गया है: पार्सर्स जो इनपुट और आउटपुट पर HTML के स्वरूपण और गलतता को संरक्षित करते हैं।

जब आप दस्तावेज़ बदलते हैं तो अधिकांश पार्सर होते हैं, विशेषकर अगर वे पुस्तकालय की तरह XML हैं तो व्हाट्सएप, टिप्पणियों और DOM की गलतता को दूर कर देगा।

जेरिको एकमात्र ऐसा पार्सर है जो मुझे पता है कि आप व्हाट्सएप फॉर्मेटिंग और HTML की गलतता (अगर कोई है) को संरक्षित करते हुए गंदा HTML में हेरफेर करने की अनुमति देता है।


3

दो अन्य विकल्प HTMLCleaner और HTMLParser हैं

मैंने अपने द्वारा विकसित किए गए क्रॉलर / डेटा निष्कर्षण ढांचे के लिए यहां अधिकांश पार्सर्स की कोशिश की है। मैं डेटा निष्कर्षण कार्य के थोक के लिए HTMLCleaner का उपयोग करता हूं। ऐसा इसलिए है क्योंकि यह HTML, XHTML, HTML 5 की एक आधुनिक रूप से आधुनिक बोली को नामस्थान के साथ समर्थन करता है, और यह DOM का समर्थन करता है, इसलिए इसे जावा के XPath कार्यान्वयन में बनाया गया है

HTMLCleaner के साथ अन्य पार्सरों की तुलना में ऐसा करना बहुत आसान है: JSoup उदाहरण के लिए DOM के बजाय DOM जैसे इंटरफेस का समर्थन करता है, इसलिए कुछ असेंबली की आवश्यकता होती है । जेरिको के पास SAX- लाइन इंटरफ़ेस है, इसलिए फिर से कुछ काम करने की आवश्यकता है, हालांकि सुजीत पाल के पास यह करने का एक अच्छा विवरण है लेकिन अंत में HTMLCleaner ने बेहतर काम किया।

मैं एक टेबल निष्कर्षण कार्य के लिए HTMLParser और जेरिको का भी उपयोग करता हूं, जो पर्ल के लिबास-टेबल-टेक्स्ट- पर्ल के उपयोग से लिखे गए कुछ कोड को प्रतिस्थापित करता है । मैं HTML को टेबल के लिए फ़िल्टर करने के लिए HTMLParser का उपयोग करता हूं, फिर इसे पार्स करने के लिए जेरिको का उपयोग करता हूं। मैं एमजेबी और एडम की टिप्पणियों से सहमत हूं कि जेरिको कुछ मामलों में अच्छा है क्योंकि यह अंतर्निहित HTML को संरक्षित करता है। इसमें एक प्रकार का गैर-मानक SAX इंटरफ़ेस है, इसलिए XPath प्रसंस्करण के लिए HTMLCleaner बेहतर है।

जावा में पार्सिंग HTML एक आश्चर्यजनक रूप से कठिन समस्या है क्योंकि सभी पार्सर कुछ प्रकार के विकृत HTML सामग्री पर संघर्ष करते हैं।

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