간단한 뉴스 리더 앱을 만들고 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"));
을 사용하면 문제가 없습니다.