2011-10-09 15 views
19

Używam JSoup do analizowania treści z http://www.latijnengrieks.com/vertaling.php?id=5368. jest to strona trzecia i nie określa właściwego kodowania. Używam następujący kod do załadowania danych:JSoup kodowanie znaków problemu

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(); 
     } 


    }  

} 

To daje następujące wyniki:

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. 

jest tam jakikolwiek sposób? Znaki mogą być ponownie oryginalne (ü) na wyjściu?

+0

Jsoup można analizowania poprawnie. Jak wizualizujesz wyjście? W oknie konsoli? Tekst zapisany w pliku? –

+0

końcowy wynik będzie w android TextView, ale to okno konsoli, a android logcat dał takie same wyniki. – Hihaatje

+0

Balus ma twoją odpowiedź. –

Odpowiedz

47

Brak atrybutu charset w odpowiedzi HTTP Content-Type nagłówka. Jsoup użyje domyślnego zestawu znaków platformy podczas analizowania kodu HTML. Model Document.OutputSettings#charset() nie będzie działał, ponieważ jest używany tylko do prezentacji (na html() i text()), a nie do analizowania danych (innymi słowy, jest już za późno).

Należy przeczytać adres URL jako InputStream i ręcznie określić zestaw znaków w metodzie 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()); 
    } 
} 

wynika to tutaj w

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

** To ** odpowiedź, której szukam! Jeszcze raz dziękuję Balus i 5+, gdybym mógł! –

+0

@Hovercraft: nie ma za co. Nawiasem mówiąc, Jonathan dodała 'Element # textNodes()' na nadchodzący Jsoup 1.6.2 Które nie powinno sprawić, że 'instanceof' sprawdzić zbędne. Możesz po prostu "dla (węzeł TextNode: paragraph.textNodes())". Zobacz także http://stackoverflow.com/questions/7164376/how-to-extract-separate-text-nodes-with-jsoup/7164518#7164518 – BalusC

+0

Dziękuję za tę odpowiedź. – AHungerArtist

4

Dokumentacja Jsoup stwierdza, że ​​Jsoup powinien automatycznie wykryć poprawny zestaw znaków podczas czytania w dokumencie, ale z jakiegoś powodu nie działa on dla mnie. Następnie próbowałem ręcznie ustawić charset dokumentu Korzystanie outputSettings() charset (...).

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

Ale to nadal nie działa, więc może robię to źle (Właśnie uczę Jsoup).

Jeden obejście, że nie działa, przynajmniej dla mnie, było przeczytać na stronie internetowej za pomocą skanera, który miał swój zestaw charset:

 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()); 

ale będę po ten wątek, aby zobaczyć jeśli ktokolwiek wymyśli lepszą sugestię, która nie wymaga użycia innej klasy do czytania w kodzie HTML.

+1

W moim przypadku używam UTF-8 dla chińskiego tekstu! Dzięki i tak! – Phuong

10

Cóż, zorientowali się w inny sposób, aby to zrobić. W moim przypadku miałem obiekt Jsoup Connection i chciałem odzyskać odpowiedź html z żądania post() na stronie internetowej zakodowanej przy użyciu "ISO-8859". Ponieważ domyślnym kodowaniem JSOUP jest UTF-8, pojawiła się treść z odpowiedzi (html) z zastępując niektóre litery. Musiałem jakoś przekonwertować to na ISO-8859-15. Aby to wykonać, utworzyłem połączenie

Po tym utworzeniu dokumentu odpowiedzi, który zawiera odpowiedź na post. Ze względu na to, że nie było jasne, w jaki sposób możemy ustawić kodowanie odpowiedzi w Jsoup, zdecydowałem się na wykonanie postu, a następnie zapisanie odpowiedzi jako Bajtów, zachowując właściwości kodowania. Następnie utworzyłem nowy ciąg przechodzący przez tę tablicę bajtów i właściwe kodowanie, które należy zastosować. Następnie dokument zostanie utworzony z odpowiednim kodowaniem.

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

Tak, tam jest powrót przed i po modyfikacji, gdy używamy response.html()

Przed:

62.01.09.00 - wsparcia technicznego, konserwacji i inne usługi w zakresie technologii informatycznych

Po:

62.09-1-00 - wsparcia technicznego, konserwacji i inne usługi technologia informacyjna

-1

użyłem:

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

również klasa zapamiętanych rzeczy UTF-8

Powiązane problemy