2010-02-21 4 views
5

StringReader를 (자바)에서 HTML 문서를 구문 분석하는 데 실패 : 그것은 POST 요청 후 HTTP 서버에 의해 전송 된 HTML 문서를 포함하는 문자열을 사용Tagsoup 내가이 기능이

private Node getDOM(String str) throws SearchEngineException { 

       DOMResult result = new DOMResult(); 

       try { 
         XMLReader reader = new Parser(); 
         reader.setFeature(Parser.namespacesFeature, false); 
         reader.setFeature(Parser.namespacePrefixesFeature, false); 
         Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
         transformer.transform(new SAXSource(reader,new InputSource(new StringReader(str))), result); 
       } catch (Exception ex) { 
         throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage()); 
       } 

       return result.getNode(); 
     } 

하지만 구문 분석에 실패 제대로 - 전체 문서에서 네 개의 노드 만 얻습니다. 문자열 자체는 괜찮아 보입니다. 인쇄하고 텍스트 문서로 복사하면 예상 한 페이지가 표시됩니다.

나는 위의 방법의 오버로드 된 버전을 사용하는 경우 :

private Node getDOM(URL url) throws SearchEngineException { 

       DOMResult result = new DOMResult(); 

       try { 
         XMLReader reader = new Parser(); 
         reader.setFeature(Parser.namespacesFeature, false); 
         reader.setFeature(Parser.namespacePrefixesFeature, false); 
         Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
         transformer.transform(new SAXSource(reader, new InputSource(url.openStream())), result); 
       } catch (Exception ex) { 
         throw new SearchEngineException("NukatSearchEngine.getDom: " + ex.getMessage()); 
       } 

       return result.getNode(); 
     } 

후 모든 것이 잘 작동합니다 - 나는 적절한 DOM 트리를 얻을 수 있지만, 어떻게 든 서버에서 POST 응답을 검색해야합니다.

문자열을 파일에 저장하고 다시 읽지 않아도 작동하지 않지만 여전히 동일한 결과가 나타납니다.

무엇이 문제 일 수 있습니까?

답변

0

POST 응답을 받으려면 new InputSource(url.openStream())이 아마도 연결을 열고 GET 요청의 응답을 읽습니다. Sending a POST Request Using a URL을 확인하십시오. 응답을 POST 요청을하고 얻기를 위해 체크 아웃 흥미로운 일이 될 수도

다른 가능성 : 그것은 아마 XML 인코딩에 문제가

1

인코딩 문제와 비슷합니다. 코드 예제에서 작동하지 않는 경우 URL을 constructor에 전달하여 SystemId로 사용하고 HTML을 파싱하는 Tagsoup에 문제가 발생합니다. 이 예제에서는 스트림을 InputSource 생성자에 전달합니다. 차이점은 스트림을 전달할 때 SAX 구현은 스트림에서 인코딩을 알아낼 수 있다는 것입니다.

당신이 다음 단계를 시도 할 수이를 테스트하려면 :

  • 스트림 당신이 java.io.InputStreamReader을 통해 분석하고 감지 인코딩을 확인하려면 그것에 GetEncoding이 전화를하고있는 HTML.
  • 첫 번째 예제 코드에서는 inputStreamReader가보고 한 인코딩을 전달하는 InputSource에서 setEncoding을 호출합니다.
  • 명시 적으로 인코딩을 설정하기 위해 변경된 첫 번째 예제가 html을 올바르게 구문 분석하는지 확인하십시오.

using the SAX InputSource에 대한 기사 끝 부분에 대한 설명이 있습니다.