2014-10-05 7 views
1

영화 목록을 크롤링하여 데이터베이스에 저장했습니다. 영어 문자 만 들어있는 영화에서는 모두 잘 작동하지만 영어가 아닌 문자가 포함 된 영화 이름 중 일부는 올바르게 표시되지 않는 것이 문제입니다. 예를 들어 이탈리아 영화 "Il più cruel dei giorni"는 "Il pi & ugrave; crude dei giorni"로 저장됩니다.자바 웹 크롤러가 영어 이외의 문자를 인식 할 수 없습니다.

누군가 해결책이있을 경우 친절하게 알려주실 수 있습니까? (나는 크롤러의 언어를 설정할 수 있음을 알고 있지만 이미 이탈리아어로 영화 제목을 크롤링했으나 영문 제목을 크롤링하려고 할 때 Imdb에 영어 이외의 문자가있는 영화가 아직 남아 있습니다)

편집 : 여기 내 코드입니다 :

String baseUrl = "http://www.imdb.com/search/title?at=0&count=250&sort=num_votes,desc&start="+start+"&title_type=feature&view=simple"; 

label1: try { 

    org.jsoup.Connection con = Jsoup.connect(baseUrl).userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21").header("Accept-Language", "en"); 
    con.timeout(30000).ignoreHttpErrors(true).followRedirects(true); 
    Response resp = con.execute(); 
    Document doc = null; 

    if (resp.statusCode() == 200) { 

     doc = con.get();          

     Elements myElements = doc.getElementsByClass("results").first().getElementsByTag("table"); 
     Elements trs = myElements.select(":not(thead) tr"); 

     for (int i = 0; i < trs.size(); i++) { 

      Element tr = trs.get(i); 
      Elements tds = tr.select("td"); 

      for (int j = 3; j < tds.size(); j++) { 

       Elements links = tds.select("a[href]"); 
       String titleId = links.attr("href"); 
       String movietitle = links.html();  

        //I ADDED YOUR CODE HERE 
        Charset c = Charset.forName("UTF-16BE"); 

         ByteBuffer b = c.encode(movietitle); 
         for (int m = 0; b.hasRemaining(); m++) { 
          int charValue = (b.get()) & 0xff; 
          System.out.print((char) charValue); 
         } 

       // try{  

       // String query = "INSERT into test (movieName,ImdbId)" + "VALUES (?,?)"; 
    //    PreparedStatement preparedStmt = conn.prepareStatement(query); 
    //    preparedStmt.setString (1, movietitle); 
     //    preparedStmt.setString (2, titleId); 
     //   }catch (Exception e) 
     //  { 
     //   e.printStackTrace(); 
     //  } 

감사합니다, 여기에

+0

http://www.joelonsoftware.com/articles/Unicode.html – Tirath

+0

@Tirath : 유용한 자료를 보내 주셔서 감사합니다. 사실, 나는 Movietitle을 얻었고 DB에 저장했다. 문자열 "movietitle"에 영화 이름을 저장 한 후 인코딩 줄을 추가해야합니까?. 원래 코드를 보려면 내 업데이트를 보시겠습니까? – mOna

+0

@Tirath : 그 인코딩 라인을 추가하는 것조차도 여전히 같은 출력을 얻습니다 :(내가 혼란 스러울 때 도움이 될 수 있겠습니까? – mOna

답변

1

, 나는 질문에서 공유 문자열을 붙여 및

public class Test { 
    public static void main (String...a) throws Exception { 
     String s = "Il più crudele dei giorni"; 
     Charset c = Charset.forName("UTF-16BE"); 

     ByteBuffer b = c.encode(s); 
     for (int i = 0; b.hasRemaining(); i++) { 
      int charValue = (b.get()) & 0xff; 
      System.out.print((char) charValue); 
     } 
    } 
} 
을 시도 복사

콘솔에서 그대로 s을 인쇄합니다. 나는 당신이 이미 파일에 쓰는 코드의 일부를 가지고 있다고 가정한다. 위 코드가 제대로 작동하면 통합 할 수 있습니다.

+0

도움을 주셔서 감사합니다. 처음부터 크롤링하지 않으시겠습니까? (10 만 개 이상의 영화가 있으므로. . 내가 데이터베이스에서 그들을 변경하고 업데이 트하는 어떤 방법이 있습니까? – mOna

+0

내가 생각할 수있는 건 - 질문에'테이블'에서'열 값'을 읽고 그것을 업데이 트하는 별도의 클래스를 작성하고 그것을 다시 DB에. – Tirath

+0

당신의 코드를 시도했지만 나에게 도움이 안된다 .. 아무 일도 없었어요 : ( – mOna