सामान्य
लगभग सभी ज्ञात 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 जाने का रास्ता है।