एंड्रॉइड में पार्स HTML


83

मैं एक वेबपेज से एंड्रॉइड में HTML पार्स करने की कोशिश कर रहा हूं, और चूंकि वेबपेज अच्छी तरह से नहीं बना है, मुझे मिलता है SAXException

क्या एंड्रॉइड में HTML को पार्स करने का एक तरीका है?


मुझे संदेह है कि राइनो निर्भरता एंड्रॉइड पर संकलन करने के लिए htmlunit नरक बनाएगी, लेकिन आप कोशिश कर सकते हैं ... इसके अलावा, कुछ अन्य गैर-सख्त HTML पार्सर जैसे कि सूप काम कर सकते हैं।
एलेक्स

मुझे आश्चर्य है कि अगर वेबकिट यहाँ इस्तेमाल किया जा सकता है।
ज़िया

जवाबों:


71

मेरे सामने अभी यह समस्या आई. मैंने कुछ चीजों की कोशिश की, लेकिन JSoup का उपयोग करने पर बस गया । जार 132k के बारे में है, जो थोड़ा बड़ा है, लेकिन अगर आप स्रोत डाउनलोड करते हैं और कुछ तरीके निकालते हैं जो आप उपयोग नहीं करेंगे, तो यह उतना बड़ा नहीं है।
=> इसके बारे में अच्छी बात यह है कि यह बुरी तरह से गठित HTML को संभाल लेगा

यहाँ उनकी साइट से एक अच्छा उदाहरण है।

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

//http://jsoup.org/cookbook/input/load-document-from-url
//Document doc = Jsoup.connect("http://example.com/").get();

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

1
आप पूर्ण जार सहित कोशिश कर सकते हैं, और अप्रयुक्त कोड को अलग करने के लिए अपने उत्पादन रिलीज में अपने ऐप पर प्रोगार्ड चला सकते हैं।
एंड्रयू मैकेंजी

3
चेतावनी: JSoup बहुत धीमी है।
केविन

@kevin उस दावे का स्रोत है? आपके पास कुछ डीबगिंग सक्षम हो सकती है।
goetzc

क्लाइंट पक्ष पर html पृष्ठ के प्रतिपादन के दौरान जावा स्क्रिप्ट का उपयोग करके गतिशील रूप से भरी हुई सामग्री के बारे में क्या? क्या Jsoup इस सामग्री को भी दिखाएगा?
14

56

क्या आपने Html.fromHtml (स्रोत) का उपयोग करने की कोशिश की है ?

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


1
यह बहुत ही सरल है, मैं सटीक चीजें नहीं खोज सकता (जैसे XPATH)

कृपया ध्यान दें। यह "सभी थ्रेड्स को निलंबित करना" होगा। जब इसमें html फॉर्मेट टेक्स्ट के साथ json मिलता है तो मैं इसका सामना करता हूं। HTML टेक्स्ट को सही तरीके से दिखाने में कोई समस्या नहीं थी लेकिन html.fromhtml () का उपयोग करने के बाद मुझे इसका सामना करना पड़ा।
डेविड

23
String tmpHtml = "<html>a whole bunch of html stuff</html>";
String htmlTextStr = Html.fromHtml(tmpHtml).toString();

अच्छा और सरल, कोई प्लगइन्स नहीं, इसे प्यार करो! tnxs
RonEskinder

1
नोट के रूप में: toString()जिस Spannedऑब्जेक्ट से कॉल किया जाता है, उस पर कॉल करने से Html.fromHtml(str)कई HTMLटैग काम नहीं करेंगे (सहित <i> <u> <b>)। तो अगर आप एक myTextView.setText(Html.fromHtml(str))
टेक्स्टव्यू

@ साकिबॉय आप सही कह रहे हैं। इसके अतिरिक्त और भी कई टैग हैं जिनके साथ काम नहीं करता है Html.fromHtml()। इसे बाहर की जाँच करें stackoverflow.com/a/3150456/1987045
राहुल रवींद्रन

कमाल, वास्तव में मैं क्या चाहता था, मेरे सर्वर साइड देव मुझे html भेज रहे थे, अब मैं इसे आसानी से कच्चे स्ट्रिंग में बदल सकता
हूं

3

हम सभी जानते हैं कि प्रोग्रामिंग में अनंत संभावनाएं हैं। किसी भी समस्या के लिए समाधान की संख्या उपलब्ध है, इसलिए मुझे लगता है कि उपरोक्त सभी समाधान सही हैं और किसी के लिए उपयोगी हो सकते हैं, लेकिन मेरे लिए यह मेरा दिन बचा सकता है।

तो कोड इस तरह से जाता है

  private void getWebsite() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        final StringBuilder builder = new StringBuilder();

        try {
          Document doc = Jsoup.connect("http://www.ssaurel.com/blog").get();
          String title = doc.title();
          Elements links = doc.select("a[href]");

          builder.append(title).append("\n");

          for (Element link : links) {
            builder.append("\n").append("Link : ").append(link.attr("href"))
            .append("\n").append("Text : ").append(link.text());
          }
        } catch (IOException e) {
          builder.append("Error : ").append(e.getMessage()).append("\n");
        }

        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            result.setText(builder.toString());
          }
        });
      }
    }).start();
  }

तुम बस में ऊपर फ़ंक्शन को कॉल करने के लिए है onCreate Methodकी अपनीMainActivity

मुझे उम्मीद है कि यह एक आप लोगों के लिए भी उपयोगी है।

साथ ही मूल ब्लॉग को माध्यम पर पढ़ें


1

शायद आप WebView का उपयोग कर सकते हैं, लेकिन जैसा कि आप डॉक्टर में देख सकते हैं WebView जावास्क्रिप्ट और डिफ़ॉल्ट रूप से विजेट जैसे अन्य सामान का समर्थन नहीं करता है।

http://developer.android.com/reference/android/webkit/WebView.html

मुझे लगता है कि यदि आपको आवश्यकता हो तो आप जावास्क्रिप्ट को सक्षम कर सकते हैं।


4
हां, आप आसानी से जेएस को सक्षम कर सकते हैं। लेकिन html parsing के लिए webview का उपयोग करने की कोई आवश्यकता नहीं है।
लड़का

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