2011-09-28 5 views
3

먼저 도움을 주신 데 대해 감사드립니다.HTML 혼합 인코딩?

현재 HTML 컨텐트를 구문 분석하고 HTML 태그를 제거한 다음 구문 분석에서 검색 한 텍스트를 철자 검사하는 웹 크롤러를 작성하고 있습니다.

HTML 태그 및 맞춤법 검사를 제거해도 JSoup 및 Google 맞춤법 검사 API를 사용하여 문제가 발생하지 않았습니다.

URL에서 내용을 풀어서이 정보를 바이트 []에 전달한 다음 궁극적으로 문자열을 제거하여 철자를 확인하고 철자를 검사 할 수 있습니다. 문자 인코딩에 문제가 있습니다. 예를 들어

http://www.testwareinc.com/를 분석 ...

원문 : 우리는 우리의 모바일 웹과 모바일 앱 테스트 서비스를 확장 한.

는 ... 페이지가 ... 메타 태그에 따라

ISO-8859-1 구문 분석을 ISO-8859-1을 사용하고 있습니다 : 위브는 모바일 웹 및 모바일 앱 테스트 서비스를 확장. 다음 UTF-8 ...

UTF-8 구문 분석을 사용하려고

... :은 위브는 모바일 웹 및 모바일 앱 테스트 서비스를 확대했다.

질문 그것은 웹 페이지의 HTML이 인코딩의 혼합을 포함 할 수 수 있습니까? 어떻게 발견 될 수 있습니까?

+0

텍스트 다루기. 행운을 빕니다! – cdeszaq

+0

브라우저가 아니라 16 진수 편집기에서 매우 빠르게 볼 수 있습니다. 문자는 유효한 ISO-8559-1 문자처럼 보입니다. 왜 여기 엔 두 개의 인코딩이 있다고 생각하니? 파서가 어떻게 든 그 캐릭터를 삼킬 수 없습니까? –

+0

감사합니다 cdeszaq 나는이 크롤러를 약 6 개월 동안 작업 해 왔으며 구문 분석은 모든 문제에서 나에게 문제를 일으킨 유일한 부분이지만 "in-the-wild"HTML이 사이트와 상당히 다를 수 있기 때문에 필자는 다소 알고 있었다. 대지. – mikesalvia

답변

1

문서에 2 개 이상의 인코딩이있는 것은 혼합 된 문서가 아니며 깨진 문서입니다.

불행히도 문서 정의와 일치하지 않는 인코딩을 사용하거나 지정된 인코딩에서 유효한 일부 데이터와 유효하지 않은 일부 콘텐츠가 포함 된 웹 페이지가 많이 있습니다.

이것을 처리하는 좋은 방법은 없습니다. 문서의 인코딩을 시도하고 추측하는 것은 가능하지만 어렵고 100 % 신뢰할만한 것은 아닙니다. 당신과 같은 경우 가장 간단한 해결책은 해독 할 수없는 문서의 부분을 무시하는 것입니다.

+0

답변을 주셔서 감사합니다, 불행히도, 이것은 내가 두려워했던 것입니다. juniversalchardet을 사용하여 인코딩을 정확하게 감지 할 수있을 것 같습니다. 그러나 이것이 심지어 문제를 일으킬 것이라고 확신합니다. 예를 들어, juniversalchardet을 사용하면 HTML이 cp1252를 사용하고 ISO-8859-1이 메타 태그에 명시된대로 사용되지 않는 것으로 나타났습니다. 고맙다! – mikesalvia

-2

과 같은 특수 문자가있는 것 같습니다. 도움이 될 경우 StringEscapeUtils.escapeHtml을 확인하십시오. 또는이 어떤 방법 편집

은 그가

public static void main(String[] args) throws FileNotFoundException { 
     String asd = "’"; 
     System.out.println(StringEscapeUtils.escapeXml(asd)); //output - ’ 
    System.out.println(StringEscapeUtils.escapeHtml(asd)); //output - ’ 
} 
+0

@ 대니얼 (Daniel) 질문에 대한 유일한 해결책은 설문지를 염두에 두는 것입니다. 당신은 그가 대답을 부정하기 전에 그에게 해결책이 아니라고 말할 수있을 것이라고 기다릴 수있었습니다. –

+0

StringEscapeUtils이 작동하지 않습니다. 나는 노력했다. 소스에서 아포스트로피는 HTML ’이 아닌 아포스트로피로 인코딩되므로 작동하지 않습니다. – mikesalvia

+0

@spitpsu ur 코딩을 확인하십시오. 내가 논리를 시도하고 위의 그림과 같이 출력을 얻었다. 질문에서 문자를 복사하고 로직을 다시 시도하거나 코드를 사용하십시오. 코드는 훌륭하게 작동합니다. 문제가 해결 될 경우 답을 수락하십시오. 당신의 질문은 이미 4 점을 받았다 –

0

아파치 티카는 인코딩 검출기를 가지고 작업 코드를 얻을 수 없습니다로이 논리를 추가했다. C++에서 무언가가 필요하고 돈을 쓸 수있는 위치에 있다면 상업적 대안도 있습니다.

나는 각 웹 페이지가 인코딩이지만 쉽게 거의 보장에 대한 어느 착각 될 수 있습니다.

+0

나는 juniversalchardet에 가기로 결정했다. 그것은 잘 작동하는 것 같다. juniversalchardet이 Charset을 찾을 수없는 경우 메타 태그를 사용하여 폴백 (fallback)하는 방법을 조사하고 싶을 수 있습니다. – mikesalvia

2

아포스트로피가 0x92 바이트로 코딩 된 것처럼 보입니다. Wikipedia에 따르면이 코드는 할당되지 않은/개인 코드 포인트입니다.+0092 (개인 사용 두) 아포스트로피로 표현 될 나타납니다 브라우저가 아닌 인코딩 1 바이트 유니 코드 코드 포인트의 가정에 의해 다시 폭포처럼

이부터, 그것은 보인다. 잠깐만 기다려주세요. 1 바이트 인 경우 cp1252 : 브라우저에 광고 된 CP에 따른 대체 전략 (예 : ISO-8859-1 -> CP1252)이 있어야합니다.

여기에 인코딩을 혼합하지 않고 다른 사람이 깨진 문서를 말했습니다. 그러나 때로는 도움이되는 대체 휴리스틱 (fallback heuristic)이 있습니다.

궁금한 점이있는 경우 FF 또는 Chrome의 소스 코드를 보면서 이러한 작업을 정확하게 수행 할 수 있습니다.

+0

juniversalchardet을 실행할 때 페이지가 실제로 CP1252이고 메타 태그에 설정된대로 ISO-8859-1이 아닌 것으로 보입니다. CP1252를 Charset으로 사용하여 InputStream을 디코딩 할 때 아포스트로피가 올바르게 표시됩니다. – mikesalvia