2013-08-11 3 views
0

간단한 뉴스 리더 앱을 만들고 HTMLCleaner를 사용하여 데이터를 검색하고 구문 분석합니다.HTML Cleaner + XPath가 Android 앱에서 작동하지 않습니다.

java -jar htmlcleaner-2.6.jar src=http://www.reuters.com/home nodebyxpath=//div[@id=\"topStory\"]

curl www.reuters.com | xmllint --html --xpath //div[@id='"topStory"'] -

모두 내가 원하는 데이터를 반환을 : 나는 성공적으로 내가 HTMLCleaner의 명령 줄 버전을 사용하고, 예를 들어 xmllint가를 사용하여 필요한 데이터를 입수했습니다. 그럼 내 코드에서 HTMLCleaner를 사용하여이 요청을하면 아무 결과도 얻지 못합니다. 더욱 문제가되는 것은 //div과 같은 기본 쿼리조차도 내 응용 프로그램에서 8 개의 노드 만 반환하고 명령 줄에서는 70+가 올바른 것으로보고된다는 것입니다.

여기에 제가 지금 작성한 코드가 있습니다. AsyncTask을 확장 한 Android 클래스에 있으므로 백그라운드에서 수행됩니다. 최종 코드는 실제로 필요한 텍스트 데이터를 가져 오지만 결과를 반환하는 데 문제가 있습니다. I 로그 제목 노드를 기록하면 노드 수가 0입니다.

나는 xpath 쿼리 문자열을 이스케이프 처리하는 모든 방법을 시도했지만 아무런 차이가 없습니다. HTMLCleaner 코드는 내 프로젝트에서 별도의 소스 폴더에 있으며 적어도 내 생각에 다른 응용 프로그램과 함께 dalvik로 컴파일되므로 호환되지 않는 jar 파일이 문제가되어서는 안됩니다.

HTMLCleaner 파일을 덤프하려했지만 LogCat과 잘 작동하지 않아서 덤프 할 때 페이지 마크 업의 대부분이 누락되어 HTMLCleaner가 잘못 구문 분석되어 대부분의 페이지가 삭제되었다고 생각하게되었지만 커맨드 라인 버전이 잘 작동 할 때 어떻게 될 수 있습니까?

또한 앱이 중단되지 않으며 예외가 기록되지 않습니다.

protected Void doInBackground(URL... argv) { 
    final HtmlCleaner cleaner = new HtmlCleaner(); 
    TagNode lNode = null; 
    try { 
     lNode = cleaner.clean(argv[0].openConnection().getInputStream()); 
     Log.d("LoadMain", argv[0].toString()); 
    } catch (IOException e) { 
     Log.d("LoadMain", e.getMessage()); 
    } 

    final String lTitle = "//div[@id=\"topStory\"]"; 
// final String lBlurp = "//div[@id=\"topStory\"]//p"; 

    try { 
     Object[] x = lNode.evaluateXPath(lTitle); 
//  Object[] y = lNode.evaluateXPath(lBlurp); 
     Log.d("LoadMain", "Title Nodes: " + x.length ); 
//  Log.d("LoadMain", "Title Nodes: " + y.length); 
//  this.mBlurbs.add(new BlurbView (this.mContext, x.getText().toString(), y.getText().toString())); 

    } catch (XPatherException e) { 
     Log.d("LoadMain", e.getMessage()); 
    } 

    return null; 
} 

모든 도움을 주시면 감사하겠습니다. 고맙습니다.

업데이트 : 나는이 문제를 http 요청과 관련된 것으로 좁혔습니다. html 소스를 애셋으로로드하면 내가 원하는 것을 얻는다. 문제는 http 요청을받는 것이다. 즉 lNode = cleaner.clean(getAssets().open("reuters.html"));을 사용하면 문제가 없습니다.

답변

0

http 요청이 모바일 웹 사이트로 리디렉션되고있는 것이 문제였습니다. 이것은 User-Agent 속성을 변경하여 해결되었습니다.

private static final String USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0"; 

HttpURLConnection lConn = (HttpURLConnection) argv[0].openConnection(); 
lConn.setRequestProperty("User-Agent", USER_AGENT); 
lConn.connect(); 
lNode = cleaner.clean(lConn.getInputStream()); 
관련 문제