私は単純なニュース リーダー アプリを構築しており、HTMLCleaner を使用してデータを取得および解析しています。たとえば、HTMLCleaner のコマンドライン バージョンと xmllint を使用して、必要なデータを正常に取得できました。
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 を使用してこのリクエストを作成しようとすると、結果が得られません。さらに厄介なのは、//div
コマンド ラインが正しい 70+ を報告しているのに、アプリで 8 つのノードしか返さないような基本的なクエリでさえあることです。
ここに私が今持っているコードがあります。これは拡張する Android クラスにAsyncTask
あるため、バックグラウンドで実行されます。最終的なコードは実際に必要なテキスト データを取得しますが、結果を返すだけで問題が発生します。タイトル ノードをログに記録すると、ノード数がゼロになります。
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") );
は正常に機能します。