2011-10-09 18 views
19

मैं http://www.latijnengrieks.com/vertaling.php?id=5368 से सामग्री को पार्स करने के लिए JSoup का उपयोग कर रहा हूं। यह एक तृतीय पक्ष वेबसाइट है और उचित एन्कोडिंग निर्दिष्ट नहीं करता है।JSoup वर्ण एन्कोडिंग समस्या

Aeneas dwaalt rond in Troje en zoekt Cre?sa. Cre?sa is echter op de vlucht gestorven Plotseling verschijnt er een schim. Het is de schim van Cre?sa. De schim zegt:'De oorlog woedt!' Troje is ingenomen! Cre?sa is gestorven:'Vlucht!' Aeneas vlucht echter niet. Dan spreekt de schim:'Vlucht! Er staat jou een nieuw vaderland en een nieuw koninkrijk te wachten.' Dan pas gehoorzaamt Aeneas en vlucht. 

वहाँ है किसी भी तरह से:

public class Loader { 

    public static void main(String[] args){ 
     String url = "http://www.latijnengrieks.com/vertaling.php?id=5368"; 

     Document doc; 
     try { 

      doc = Jsoup.connect(url).timeout(5000).get(); 
      Element content = doc.select("div.kader").first(); 
      Element contenttableElement = content.getElementsByClass("kopje").first().parent().parent(); 

      String contenttext = content.html(); 
      String tabletext = contenttableElement.html(); 

      contenttext = Jsoup.parse(contenttext).text(); 
      contenttext = contenttext.replace("br2n", "\n"); 
      tabletext = Jsoup.parse(tabletext.replaceAll("(?i)<br[^>]*>", "br2n")).text(); 
      tabletext = tabletext.replace("br2n", "\n"); 

      String text = contenttext.substring(tabletext.length(), contenttext.length()); 
      System.out.println(text); 


     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    }  

} 

इस निम्नलिखित उत्पादन देता है: मैं डेटा लोड करने के लिए निम्न कोड का उपयोग कर रहा हूँ? अंक आउटपुट में मूल (ü) फिर से हो सकता है?

+0

Jsoup को पार्स किया जा सकता है चीजों को बचा लिया। आप आउटपुट को कैसे देख रहे हैं? एक कंसोल विंडो में? एक फ़ाइल में लिखा पाठ? –

+0

अंतिम आउटपुट एक Android TextView में हो जाएगा, लेकिन यह एक कंसोल विंडो है, और एंड्रॉयड logcat ही परिणाम दे दी है। – Hihaatje

+0

बलस का आपका जवाब है। –

उत्तर

47

charset विशेषता HTTP प्रतिक्रिया Content-Type शीर्षलेख में अनुपलब्ध है। HTML को पार्स करते समय Jsoup प्लेटफार्म डिफ़ॉल्ट वर्णमाला का सहारा लेगा। Document.OutputSettings#charset() काम नहीं करेगा क्योंकि यह केवल प्रस्तुति के लिए उपयोग किया जाता है (html() और text() पर), डेटा को पार्स करने के लिए नहीं (दूसरे शब्दों में, यह बहुत देर हो चुकी है)।

आपको URL को InputStream के रूप में पढ़ने की आवश्यकता है और मैन्युअल रूप से Jsoup#parse() विधि में वर्णमाला निर्दिष्ट करें।

String url = "http://www.latijnengrieks.com/vertaling.php?id=5368"; 
Document document = Jsoup.parse(new URL(url).openStream(), "ISO-8859-1", url); 
Element paragraph = document.select("div.kader p").first(); 

for (Node node : paragraph.childNodes()) { 
    if (node instanceof TextNode) { 
     System.out.println(((TextNode) node).text().trim()); 
    } 
} 

इस में

Aeneas dwaalt rond in Troje en zoekt Creüsa. 
Creüsa is echter op de vlucht gestorven 
Plotseling verschijnt er een schim. 
Het is de schim van Creüsa. 
De schim zegt:'De oorlog woedt!' 
Troje is ingenomen! 
Creüsa is gestorven:'Vlucht!' 
Aeneas vlucht echter niet. 
Dan spreekt de schim:'Vlucht! Er staat jou een nieuw vaderland en een nieuw koninkrijk te wachten.' 
Dan pas gehoorzaamt Aeneas en vlucht. 
+0

** यह ** वह उत्तर है जिसे मैं ढूंढ रहा हूं! फिर से धन्यवाद बलस, और 5+ अगर मैं कर सकता था! –

+0

@ होवरक्राफ्ट: आपका स्वागत है। वैसे, जोनाथन ने आने वाले जसप 1.6.2 के लिए 'एलिमेंट # टेक्स्ट नोड्स() 'जोड़ा है, जिसे' exampleof' चेक अनिवार्य बनाना चाहिए। आप बस 'के लिए (टेक्स्ट नोड नोड: पैराग्राफ.टेक्स्ट नोड्स()) '। इन्हें भी देखें http://stackoverflow.com/questions/7164376/how-to-extract-separate-text-nodes-with-jsoup/7164518#7164518 – BalusC

+0

इस उत्तर के लिए धन्यवाद। – AHungerArtist

4

जेएसओपी दस्तावेज बताता है कि दस्तावेज में पढ़ते समय जसप को स्वचालित वर्णमाला का पता लगाना चाहिए, लेकिन किसी कारण से, यह मेरे लिए काम नहीं कर रहा है। । मैं तो मैन्युअल outputSettings का उपयोग कर दस्तावेज़ के चारसेट() चारसेट (...) स्थापित करने के लिए करने की कोशिश की:

doc.outputSettings().charset("ISO-8859-1"); 

लेकिन है कि अभी भी काम नहीं किया है, तो शायद मैं यह गलत (मैं सिर्फ सीख रहा हूँ कर रहा हूँ Jsoup)।

एक काम के आसपास है कि काम किया है, कम से कम मेरे लिए, एक स्कैनर है कि इसके चारसेट सेट था का उपयोग कर वेब पेज में पढ़ने के लिए गया था:

 String charset = "ISO-8859-1"; 

    URL myUrl = new URL(url); 
    Scanner urlScanner = new Scanner(myUrl.openStream(), charset); 
    StringBuilder sb = new StringBuilder(); 
    while (urlScanner.hasNextLine()) { 
     sb.append(urlScanner.nextLine() + "\n"); 
    } 
    urlScanner.close(); 

    doc = Jsoup.parse(sb.toString()); 

लेकिन मैं यह देखने के लिए इस सूत्र निम्नलिखित हो जाएगा अगर कोई बेहतर सुझाव के साथ आता है, तो जिसे HTML में पढ़ने के लिए किसी अन्य वर्ग के उपयोग की आवश्यकता नहीं होती है।

+1

मेरे मामले में, मैं चीनी पाठ के लिए यूटीएफ -8 का उपयोग करता हूं! वैसे भी धन्यवाद! – Phuong

10

खैर यहाँ परिणाम है, मैं एक और तरीका है कि ऐसा करने के लिए पता लगा। मेरे मामले में, मेरे पास एक Jsoup कनेक्शन ऑब्जेक्ट था और मैं "आईएसओ -885 9" के साथ एन्कोड किए गए वेबसाइट में एक पोस्ट() अनुरोध से एचटीएमएल प्रतिक्रिया पुनर्प्राप्त करना चाहता था। चूंकि JSOUP के लिए डिफ़ॉल्ट एन्कोडिंग यूटीएफ -8 है, प्रतिक्रिया (एचटीएमएल) की सामग्री letters कुछ अक्षरों को बदलने के साथ आ रही थी। मुझे किसी भी तरह इसे आईएसओ -885 9-15 में परिवर्तित करने की आवश्यकता थी। ऐसा करने के लिए, मैंने कनेक्शन बनाया है

Connection connectionTest = Jsoup.connect("URL") 
.cookie("cookiereference", "cookievalue") 
.method(Method.POST); 

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

Document response = Jsoup.parse(new String(
connectionTest.execute().bodyAsBytes(),"ISO-8859-15")); 

तो, वहाँ से पहले और संशोधन के बाद वापसी है जब हम response.html का उपयोग()

से पहले:

62।09/01/00 - तकनीकी सहायता, सूचना प्रौद्योगिकी में रखरखाव और अन्य सेवाओं

के बाद:

62.09-1-00 - तकनीकी समर्थन, रखरखाव और अन्य सेवाओं सूचना प्रौद्योगिकी

-1

मैं प्रयोग किया है:

public static String charset = "UTF-8"; 
doc = Jsoup.parse(new URL(theURL).openStream(), charset, theURL); 

इसके अलावा, वर्ग सही ढंग से UTF-8

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