1

基本的にここで独自のことをやろうとする必要があることはわかっています。ここはリクエストを行う場所ではありませんが、Html から何かを読み取らなければならないのは本当に嫌いです。その方法が本当にわかりません。

それで、私は 150 ポイントの報奨金を授与します (私が安いというわけではありません。私はこれ以上何もできません :( ) 良い助けを得ることができれば、または少なくともサンプル コードで正しい方向に向けられることができれば。 .

私は何を達成しようとしていますか?

  • 次のNASA のページから最新ニュースを取得しようとしています。
  • このニュースを ListView に表示する予定です。もちろん、ListView には最初は表示されるコンテンツがほとんどなく、上のページから入手できるデータのみが表示されます。ここに簡単なモックアップがあります。

それだけです。ユーザーがリンクをクリックすると、記事全体を表示する別のフラグメントに移動します。これが完了したら、後でその方法を見つけます。

そこで、次のビットで HtmlCleaner を使用してみました。

private class CleanUrlTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            //try cleaning the nasa page. 
            mNode = mCleaner.clean(mUrl);
        } catch (Exception e) {
            Constants.logMessage("Error cleaning file" + e.toString());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {         
        try {
            //For now I am just writing to an xml file to sort of read through
            //God is HTML code ugly. 
            new PrettyXmlSerializer(mProps).writeToFile(
                    mNode, FILE_NAME, "utf-8"
                );
        } catch (Exception e) {
            Constants.logMessage("Error writing to file: " + e.toString());
        }
    }       
}

しかし、そこから、私はほとんど迷っています。XML出力は次のとおりです。ただし、記事のコンテンツごとに特定のタグ階層に何らかの繰り返しがあることに気付きました。次のようになります。左は画像と記事のリンク右は記事のタイトルとプレビュー コンテンツです。

クラス名の階層

だから、誰かがどうにかしてコンテンツを入手する方法を理解するのを手伝ってくれるなら、私はそれを大いに感謝します.

補足として、このプロジェクトは 2013 NASA International Space Apps Challenge の一環としての教育目的のためのものです。詳細はこちら.

おまけの質問として、同じリンクには、現在のメンバーを含む、現在、将来、および過去の遠征の情報が含まれており、遠征の各メンバーには、バイオ ページへのリンクがあります。

それらのタグは反復的ではないように見えますが、名前は事前に設定されていて一定のようで、「tab1」、「tab2」、「tab3」などがあります。

そこから得たいことは次のとおりです。

  • 遠征番号と日程。
  • 遠征メンバー
  • 各メンバーの略歴へのリンク。

繰り返しますが、もしあればサポートをありがとう、本当に感謝しています。

4

1 に答える 1

2

したがって、XML 出力からデータを取得するためにXPATHを使用する方法を理解するだけでよいようです。

基本的に、XPATH の考え方は、XML を使用して任意のノードを取得できるということです。私の場合、上の画像でわかるように、非常に具体的な情報を取得したかったのです。

記事リンクの XPATH は次のとおりです。

public static final String XPATH_ARTICLE_LINKS = 
"//div[@class='landing-slide']/div[@class='landing-slide-inner']/div[@class='fpss-img_holder_div_landing']/div[@id='fpss-img-div_466']/a/@href";

whereは、ドキュメント内のどこにあるかに関係なく(「//」がそれを宣言する)、クラス名がランディング スライドであるdiv//div[@class='landing-slide']を探していることを意味します。そこからさらにアイテムの階層を調べて、最終的に属性の値を取得します (属性は「@」文字で示されます)。 href

XPATH を取得したので、この値を HTML クリーナーに渡すだけです。これは a を介して行っていAsyncTaskますが、これは最終的なコードではないことに注意してください。

まず、使用される XPATH は次のとおりです。

private class News {
    static final String XPATH_ARTICLE_LINKS = 
            "//div[@class='landing-slide']/div[@class='landing-slide-inner']/div[@class='fpss-img_holder_div_landing']/div[@id='fpss-img-div_466']/a/@href";
    static final String XPATH_ARTICLE_IMAGES = 
            "//div[@class='landing-slide']/div[@class='landing-slide-inner']/div[@class='fpss-img_holder_div_landing']/div[@id='fpss-img-div_466']/a/img/@src";
    static final String XPATH_ARTICLE_HEADERS = 
            "//div[@class='landing-slide']/div[@class='landing-slide-inner']/div[@class='landing-fpss-introtext']/div[@class='landing-slidetext']/h1/a";
    static final String XPATH_ARTICLE_DESCRIPTIONS = 
            "//div[@class='landing-slide']/div[@class='landing-slide-inner']/div[@class='landing-fpss-introtext']/div[@class='landing-slidetext']/p";                       
}

AsyncTask の場合:

private class CleanUrlTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            //try cleaning the nasa page. (Root Node) 
            mNode = mCleaner.clean(mUrl);

            //Get all of the article links
            Object[] mArticles = mNode.evaluateXPath(News.XPATH_ARTICLE_LINKS);
            //Get all of the image links
            Object[] mImages = mNode.evaluateXPath(News.XPATH_ARTICLE_IMAGES);
            //Get all of the Article Titles
            Object[] mTitles = mNode.evaluateXPath(News.XPATH_ARTICLE_HEADERS);
            //Get all of the Article Descriptions
            Object[] mDescriptions = mNode.evaluateXPath(News.XPATH_ARTICLE_DESCRIPTIONS);

            Constants.logMessage("Found : " + mArticles.length + " articles");
            //Value containers
            String link, image, title, description;

            for (int i = 0; i < mArticles.length; i++) {
                //The Nasa Page returns link that are often not fully qualified URL, so I need to append the prefix if needed. 
                link = mArticles[i].toString().startsWith(FULL_HTML_PREFIX)? mArticles[i].toString() : NASA_PREFIX + mArticles[i].toString();
                image = mImages[i].toString().startsWith(FULL_HTML_PREFIX)? mImages[i].toString() : NASA_PREFIX + mImages[i].toString();
                //On the previous two items we were getting the attribute value
                //Here, we actually need the text inside the actual element, and so we want to cast the object to a TagNode
                //The TagNode allows to extract the Text for the supplied element. 
                title = ((TagNode)mTitles[i]).getText().toString();
                description = ((TagNode)mDescriptions[i]).getText().toString();
                //Only log the values for now. 
                Constants.logMessage("Link to article is " + link);
                Constants.logMessage("Image from article is " + image);
                Constants.logMessage("Title of article is " + title);
                Constants.logMessage("Description of article is " + description);

            }
        } catch (Exception e) {
            Constants.logMessage("Error cleaning file" + e.toString());
        }
        return null;
    }

誰かが私と同じように道に迷った場合、これがあなたの道に光を当てることができることを願っています.

于 2013-04-20T00:43:05.490 に答える