2013-04-19 25 views
1

Я знаю, что мы должны в основном пытаться делать здесь свой собственный материал, и это не место для запросов, но мне очень не нравится читать материал из Html, я действительно не понимаю, как это сделать.Android, правильное использование HTMLCleaner

Итак, я получаю награду в размере 150 баллов (не то, чтобы я был дешев, я просто не могу сделать больше :(), если я получу хорошую помощь или, по крайней мере, указал в правильном направлении с некоторыми примерами кода.

Что я пытаюсь достичь?

  • Я пытаюсь получить последние новости из следующего Nasa page.
  • я планирую дисплеях эту новость на ListView, конечно, ListView имеет очень мало контента, с которого можно начать, o nly данные, доступные на странице выше, вот быстрый mock-up.

Вот именно, когда пользователь нажимает на ссылку, они будут приняты к другому фрагменту, который показывает полный article, и я выяснить, как получить, что позже, когда я могу получить это сделать.

Итак, я попытался с помощью 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 output кстати. Я тем не менее заметил, что есть какое-то повторение на определенном tag hierarchy для каждого содержания статьи, кажется, идут так: левые идет для изображения и статьи Ссылки и Право идет на название статьи и содержание предварительного

Class Name Hierarchy

Так что, если кто-то хочет помочь мне выяснить, как получить контент, я бы очень признателен.

В качестве дополнительного примечания этот проект предназначен для образовательных целей в рамках программы NASA International Space Apps Challenge 2013 года, подробнее here.

В качестве бонусного вопроса эта же ссылка содержит информацию о текущих, будущих и прошлых экспедициях, включая нынешних членов, и для каждого члена экспедиции есть ссылка на их страницу Bio.

Метки для них, похоже, не повторяются, однако имена, как представляется, являются предустановленными и постоянными, у вас есть «tab1», «tab2» и «tab3» и т. Д. И т. Д.

То, что я хотел бы получить от этого есть:

  • номер экспедиции и даты.
  • Участники экспедиции Cew
  • Ссылка на каждого члена биографии.

Опять же, Спасибо за поддержку, если она есть, я действительно ценю это.

ответ

2

Так что, видимо, все, что мне нужно было, это выяснить, как использовать XPATH, чтобы получить данные с выхода XML.

В принципе, идея с 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"; 

Где //div[@class='landing-slide'] означает, что я ищу для любого DIV имя класса десантно-слайднезависимо (далее «//» объявляет что), где они могут быть расположены в документе. И оттуда я просто иду дальше в иерархию элемента, чтобы, наконец, получить значение для атрибута href (атрибуты указываются через символ '@').

Теперь, когда у нас есть XPATH, нам просто нужно передать это значение в очиститель HTML. Я делаю это через AsyncTask, и имейте в виду, что это не последний код, но он, безусловно, получает информацию, которую я хочу.

Во-первых, XPaths используется:

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; 
    } 

В случае, если кто был так же, как потерянный, как я был, я надеюсь, что это может пролить некоторый свет на пути ,

Смежные вопросы