2008-10-26 20 views
50

मैं एक ऐप पर काम कर रहा हूं जो किसी वेबसाइट से डेटा स्क्रैप करता है और मैं सोच रहा था कि मुझे डेटा प्राप्त करने के बारे में कैसे जाना चाहिए। विशेष रूप से मैं जो एक विशिष्ट CSS वर्ग का उपयोग div टैग की संख्या में निहित डेटा की जरूरत है - (परीक्षण प्रयोजनों के लिए) वर्तमान में मैं सिर्फजावा एचटीएमएल पार्सिंग

div class = "classname" 
एचटीएमएल की प्रत्येक पंक्ति में

जाँच कर रहा हूँ - यह काम करता है, लेकिन मैं यह कर सकते हैं ' टी मदद करते हैं लेकिन महसूस करते हैं कि वहाँ एक बेहतर समाधान है।

है वहाँ किसी भी अच्छा तरीका है जहाँ मैं एक वर्ग HTML की एक लाइन देने के लिए और जैसे कुछ अच्छा तरीकों हो सकता है:

boolean usesClass(String CSSClassname); 
String getText(); 
String getLink(); 
+1

संबंधित: [अग्रणी जावा एचटीएमएल पार्सर्स के पेशेवरों और विपक्ष क्या हैं?] (Http://stackoverflow.com/questions/3152138/what-are-the-pros-and-cons-of-the-leading -जावा-एचटीएमएल-पार्सर्स) – BalusC

उत्तर

18

कई साल पहले मैं एक ही उद्देश्य के लिए JTidy प्रयोग किया है:।

http://jtidy.sourceforge.net/

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

जेटीडी एंडी क्विक ने लिखा था, जो बाद में रखरखाव की स्थिति से नीचे उतर गए। अब जेटीडी स्वयंसेवकों के एक समूह द्वारा बनाए रखा जाता है। ।।।

JTidy पर अधिक जानकारी JTidy SourceForge परियोजना पृष्ठ पर पाया जा सकता है "

+2

दुर्भाग्य से धीमी गति से धीमी गति से धीमा हो सकता है। – PlexQ

+0

जेटीडी एक त्याग परियोजना प्रतीत होता है, अब कुछ सालों से अपडेट नहीं किया गया है। – rlegendi

0

अपने HTML को अच्छी तरह से बनाई है, तो आप आसानी से एक XML पार्सर करने के लिए उपयोग कर सकते हैं आपके लिए नौकरी ... यदि आप केवल पढ़ रहे हैं, SAX आदर्श होगा।

+2

यदि आपका एचटीएमएल अच्छी तरह से गठित है। क्या यह कभी है – PlexQ

+2

ऐसा क्यों नहीं होगा? – Yuval

+0

क्योंकि मैं अन्य लोगों के साथ परियोजनाओं पर काम करता हूं, जिनमें से कुछ ऐसे डिजाइनर हैं जो सही HTML नहीं बनाते हैं, और कई अन्य लोग या तो दोगुना नहीं करते हैं, जब प्रलोभन का उपयोग किया जाता है। – PlexQ

13

आपको TagSoup, एक जावा HTML पार्सर विकृत HTML को संभालने में सक्षम हो सकता है। एक्सएमएल पार्सर्स केवल अच्छी तरह से बनाए गए एक्सएचटीएमएल पर काम करेगा।

5

HTMLParser प्रोजेक्ट (http://htmlparser.sourceforge.net/) एक संभावना हो सकती है। यह विकृत HTML को संभालने में बहुत सभ्य प्रतीत होता है। इसलिए एक एचटीएमएल क्लीनर या HTML-एक्सएमएल कनवर्टर बहुत जरूरी है,

Parser parser = new Parser(htmlInput); 
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName"); 
NodeList nodes = parser.parse(cssFilter); 
20

मुख्य समस्या के रूप में coments पूर्ववर्ती द्वारा कहा गया विकृत HTML है: निम्नलिखित स्निपेट आपको क्या चाहिए करना चाहिए। एक बार जब आप एक्सएमएल कोड (एक्सएचटीएमएल) प्राप्त कर लेते हैं तो इसे संभालने के लिए बहुत सारे टूल हैं। आप इसे एक साधारण सैक्स हैंडलर के साथ प्राप्त कर सकते हैं जो केवल आपको आवश्यक डेटा या किसी पेड़-आधारित विधि (डीओएम, जेडीओएम, इत्यादि) को निकालता है जो आपको मूल कोड को भी संशोधित करने देता है।

यहां एक नमूना कोड है जो HTML cleaner का उपयोग करता है ताकि सभी डीवीवी एक निश्चित वर्ग का उपयोग कर सकें और इसके अंदर सभी टेक्स्ट सामग्री प्रिंट कर सकें।

import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import org.htmlcleaner.HtmlCleaner; 
import org.htmlcleaner.TagNode; 

/** 
* @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom> 
*/ 
public class TestHtmlParse 
{ 
    static final String className = "tags"; 
    static final String url = "http://www.stackoverflow.com"; 

    TagNode rootNode; 

    public TestHtmlParse(URL htmlPage) throws IOException 
    { 
     HtmlCleaner cleaner = new HtmlCleaner(); 
     rootNode = cleaner.clean(htmlPage); 
    } 

    List getDivsByClass(String CSSClassname) 
    { 
     List divList = new ArrayList(); 

     TagNode divElements[] = rootNode.getElementsByName("div", true); 
     for (int i = 0; divElements != null && i < divElements.length; i++) 
     { 
      String classType = divElements[i].getAttributeByName("class"); 
      if (classType != null && classType.equals(CSSClassname)) 
      { 
       divList.add(divElements[i]); 
      } 
     } 

     return divList; 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      TestHtmlParse thp = new TestHtmlParse(new URL(url)); 

      List divs = thp.getDivsByClass(className); 
      System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***"); 
      for (Iterator iterator = divs.iterator(); iterator.hasNext();) 
      { 
       TagNode divElement = (TagNode) iterator.next(); 
       System.out.println("Text child nodes of DIV: " + divElement.getText().toString()); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
5

जेरिको: http://jericho.htmlparser.net/docs/index.html

उपयोग करने के लिए, का समर्थन करता है अच्छी तरह का गठन नहीं किया एचटीएमएल, उदाहरण के एक बहुत आसान।

58

एचटीएमएल प्रोसेसिंग के लिए उपयोगी एक और लाइब्रेरी jsoup है। जेएसओपी विकृत एचटीएमएल को साफ करने की कोशिश करता है और टैग चयनकर्ता वाक्यविन्यास जैसे jQuery का उपयोग कर जावा में एचटीएमएल पार्सिंग की अनुमति देता है।

http://jsoup.org/

+0

Jsoup सबसे अच्छा –

+0

है बाहरी जार के बिना बिना कोई विधि है? – Futuregeek

+1

@Futuregeek मैं regex का उपयोग करता था, जब तक कि मैंने यह जवाब नहीं पढ़ा [https://stackoverflow.com/a/1732454/5484609) –

3

nu.validator परियोजना एक उत्कृष्ट, उच्च प्रदर्शन HTML पार्सर कि कोनों में कटौती नहीं करता है शुद्धता के लिहाज से है।

Validator.nu HTML पार्सर जावा में HTML5 पार्सिंग एल्गोरिदम का कार्यान्वयन है। पार्सर को उन अनुप्रयोगों में एक्सएमएल पार्सर के लिए ड्रॉप-इन प्रतिस्थापन के रूप में काम करने के लिए डिज़ाइन किया गया है जो एक्सएमएल पार्सर के साथ एक्सएचटीएमएल 1.x सामग्री का समर्थन कर चुके हैं और पार्सर के साथ इंटरफेस करने के लिए सैक्स, डोम या एक्सओएम का उपयोग करते हैं। निम्न-स्तरीय कार्यक्षमता उन अनुप्रयोगों के लिए प्रदान की जाती है जो अपना स्वयं का आईओ निष्पादित करना चाहते हैं और स्क्रिप्टिंग के साथ document.write() का समर्थन करते हैं। पार्सर कोर Google वेब टूलकिट पर संकलित करता है और स्वचालित रूप से सी ++ में अनुवाद किया जा सकता है। (सी ++ अनुवाद क्षमता वर्तमान में छिपकली में उपयोग के लिए पार्सर पोर्टिंग के लिए प्रयोग किया जाता है।)

1

तुम भी XWiki HTML Cleaner उपयोग कर सकते हैं:

यह HTMLCleaner का उपयोग करता है और यह फैली वैध एक्सएचटीएमएल 1.1 सामग्री उत्पन्न करने के लिए।

4

Jerry को भूलना न भूलें, जावा में इसका jQuery: एक तेज़ और संक्षिप्त जावा लाइब्रेरी जो HTML दस्तावेज़ पार्सिंग, ट्रैवर्सिंग और मैनिपुलेटिंग को सरल बनाता है; सीएसएस 3 चयनकर्ताओं का उपयोग शामिल है।

उदाहरण:

Jerry doc = jerry(html); 
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy"); 

उदाहरण:

doc.form("#myform", new JerryFormHandler() { 
    public void onForm(Jerry form, Map<String, String[]> parameters) { 
     // process form and parameters 
    } 
}); 

बेशक, ये सिर्फ कुछ त्वरित उदाहरण भावना कैसे यह सब तरह लग रहा है मिल रहे हैं।

+0

जबकि यह लिंक प्रश्न का उत्तर दे सकता है, तो यह आवश्यक है कि आवश्यक भागों को शामिल करना बेहतर हो यहां जवाब दें और संदर्भ के लिए लिंक प्रदान करें। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। – Brian

+1

Thanx, उदाहरण जोड़ा गया। मैंने अन्य टिप्पणियों पर उदाहरण नहीं देखा है, इसलिए मैंने उसी पैटर्न का पालन किया। – igr

+0

कोई समस्या नहीं है। यह कम गुणवत्ता कतार में दिखाया गया है। मेरी टिप्पणी एसओ द्वारा स्वचालित है। – Brian

संबंधित मुद्दे