0

私は単純なニュース リーダー アプリを構築しており、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") );は正常に機能します。

4

1 に答える 1

0

問題は、http 要求がモバイル Web サイトにリダイレクトされていたことです。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() );
于 2013-08-13T02:24:32.657 に答える