2011-10-10 6 views
3

jsoup를 사용하여 다른 페이지의 html 소스 코드에서 일부 정보를 추출합니다. 대부분은 UTF-8로 인코딩되어 있습니다. 그 중 하나는 ISO-8859-1로 인코딩되어 이상한 오류가 발생합니다 (내 의견으로는).jsoup의 이상한 인코딩 동작

오류가 포함 된 페이지는 다음과 같습니다

Document doc = Jsoup.connect("http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html").userAgent("Mozilla").get(); 
String title = doc.getElementsByClass("products_name").first().text(); 

문제는 문자열 "HD Armbanduhr AUS 함유 금속의 하이픈은 다음과 같습니다 http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html

나는 다음 코드 조각 필요한 문자열을 읽어 4GB Wasserdicht 1280X960 - 5 메가 픽셀 ". öäü와 같은 일반적인 움라우트는 올바르게 읽혀집니다. 이 단일 문자는 "& # 45;"로 출력되지 않습니다. 문제를 만든다.

out.outputSettings(). charset ("ISO-8859-1")을 사용하여 (올바르게 설정된) 페이지 인코딩을 덮어 쓰려고했으나 도움이되지 않았습니다.

다음은 utf8과 iso-8859-1에서 Charset 클래스를 사용하여 문자열의 인코딩을 수동으로 변경하려고 시도했습니다. 운이 없다.

jsoup를 사용하여 html 문서를 구문 분석 한 후 올바른 문자를 얻으려는 사람에게 팁이 있습니까?

감사

+0

흠, 그것은 UTF-8에 따라 유효한 문자 (I 생각) 여야한다 — (E2 80 (93))이다. 일단 8859-1로 읽으면 다시 변환 할 수 없습니까? UTF-8로 강제 읽을 수 있습니까? –

+0

예. out.outputSettings(). charset ("UTF-8")로 강제로 처리 할 수 ​​있지만 실제로 도움이되지 않습니다. 문자 코드를 표시하려고 할 때 결과는 charcode 150이며이 페이지에서 볼 수있는대로 유효합니다 (http://www.web-source.net/symbols.htm). 이것으로, 나는 char가 하이픈이나 대쉬가 아니라는 것을 깨달았습니다. 그것은 45가 될 것입니다.charcode 150 확장 된 ASCII 문자 집합 내에 있습니다. –

답변

7

이 웹 사이트 자체의 실수입니다. 페이지는 HTTP Content-Type 응답 헤더에 어떤 캐릭터 세트없이 제공됩니다

  1. : 실제로 세 가지 실수 있습니다. HTML 메타 태그에 ISO-8859-1이 있지만이 페이지가 HTTP를 통해 게재 될 때 무시됩니다. 일반 웹 브라우저는 똑똑한 탐지를 시도하거나 플랫폼 기본 인코딩을 사용하여 Windows 컴퓨터의 CP1252 인 웹 페이지를 인코딩합니다.

  2. <meta> 태그 콘텐츠는 ISO-8859-1 인코딩 것을 척하지만 실제 문자 (U+2013 EN DASH)은 모두 그 캐릭터별로 하지covered이다. 그러나 covered은 CP1252 charset이 0x0096입니다.

  3. 웹 페이지 소스 코드에 따르면 제품 이름은 동일한 웹 페이지의 다른 곳에서 발견 된 HTML 엔터티 &ndash; 대신 리터럴 문자 을 사용합니다.

Jsoup는 많이 개발 된 웹 페이지를 투명하게 수정할 수 있지만 실제로는 Jsoup를 넘어서게됩니다. 수동으로 읽은 다음 CP1252로 Jsoup에 공급해야합니다.

String url = "http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html"; 
InputStream input = new URL(url).openStream(); 
Document doc = Jsoup.parse(input, "CP1252", url); 
String title = doc.select(".products_name").first().text(); 
// ... 
+0

'Content-Type' 헤더에 ISO-8859-1이 지정되어 있어도 브라우져가 en-dash로 '0x96'을 표시하는 것처럼 보입니다. – axtavt

+0

@axtavt : 콘텐츠 형식 헤더에 문자 집합이 없습니다. Windows에서 CP1252 인 플랫폼 기본 문자 집합이 사용됩니다. 포인트 1을 참조하십시오. – BalusC

+0

이 문제에 대한 명확한 설명에 감사드립니다! 수동 인코딩 (어제 같은 방식으로 ISO-8859-1을 시도 했음)을 사용하면 내용이 올바르게 인코딩됩니다. 나는 페이지를 utf-8로 설정하거나 Content-Type Header를 ISO-8859-1로 설정하여이 문제를 해결할 수 있기를 희망하여이 문제에 대해 웹 사이트 운영자에게 연락 할 것입니다. –