2015-02-11 2 views
0

Как я могу разобрать это с помощью jsoup?Разбор с Jsoup в arraylist

<!-- NOVINEEE --> 
<div class="right_naslov"><a href="/e-novine">e-novine</a></div> 

    <div class="right_post"> 
    <span class="right_post_nadnaslov"><font class="nadnaslov">Zanimljiv zadatak</font></span><span class="right_post_datum"><font class="datum">12.12.2014.</font></span> 
    <span class="right_post_naslov_v"><font class="naslov"><a href="/e-novine/n/?id=340">Profesor učenicima zadao najbolji zadatak ikad!</a></font></span> 
    <span class="right_post_podnaslov"><font class="podnaslov"></font></span> 
    <div class="right_post_tekst"><a href="/e-novine/n/?id=340"><img width="180" align="left" class="novine_slika_thumbm" border="0" src="/fajlovi/slike/thumbm/4161-zadatak_naslovna.jpg" /></a><p>72-godi&scaron;nji profesor biv&scaron;im učenicima iz godine u godinu &scaron;alje pisma &scaron;to nije lak zadatak jer mnogi ne žive u istoj državi. Iako radi ne&scaron;to stvarno posebno, Bruce sebe i dalje smatra prosječnim profesorom. Učenici ipak smatraju suprotno...</p> 
<div>&nbsp;</div></div> 
    </div> 
</div> 

Я хотел бы получить содержание right_naslov, а внутри класса шрифта nadnaslov, naslov, и IMG SRC и A HREF из right_post_tekst.

Я пытался сделать что-то вроде этого:

Document doc = Jsoup.connect(url).get(); 
      Elements post = doc.select("right_naslov right_post nadnaslov"); 
      HashMap<String, String> map = new HashMap<String, String>(); 

      map.put("rank", post.text()); 
      // Get the second td 
      map.put("country", post.text()); 
      // Get the third td 
      map.put("population", post.text()); 

      // Set all extracted Jsoup Elements into the array 
      arraylist.add(map); 

А потом я:

resultp = data.get(position); 

// Locate the TextViews in listview_item.xml 
rank = (TextView) itemView.findViewById(R.id.rank); 
country = (TextView) itemView.findViewById(R.id.country); 
population = (TextView) itemView.findViewById(R.id.population); 


// Capture position and set results to the TextViews 
rank.setText(resultp.get(PocetnaFragment.RANK)); 
country.setText(resultp.get(PocetnaFragment.COUNTRY)); 
population.setText(resultp.get(PocetnaFragment.POPULATION)); 

Я после этого учебника: http://www.androidbegin.com/tutorial/android-jsoup-listview-images-texts-html-tables-tutorial/

Есть несколько right_posts

Благодаря


UPDATE

Получение следующей ошибки после ответа, расположенного вниз (после всех комментариев):

02-14 23:50:17.490 2469-2530/gimbi.edu.ba W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Element.select(java.lang.String)' on a null object reference 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at gimbi.edu.ba.PocetnaFragment$JsoupListView.doInBackground(PocetnaFragment.java:147) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at gimbi.edu.ba.PocetnaFragment$JsoupListView.doInBackground(PocetnaFragment.java:103) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
02-14 23:50:17.494 2469-2530/gimbi.edu.ba W/System.err﹕ at java.lang.Thread.run(Thread.java:818) 
02-14 23:50:46.713 2469-4859/gimbi.edu.ba W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'org.jsoup.select.Elements org.jsoup.nodes.Element.select(java.lang.String)' on a null object reference 
02-14 23:50:46.718 2469-4859/gimbi.edu.ba W/System.err﹕ at gimbi.edu.ba.PocetnaFragment$JsoupListView.doInBackground(PocetnaFragment.java:147) 
02-14 23:50:46.718 2469-4859/gimbi.edu.ba W/System.err﹕ at gimbi.edu.ba.PocetnaFragment$JsoupListView.doInBackground(PocetnaFragment.java:103) 
02-14 23:50:46.719 2469-4859/gimbi.edu.ba W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288) 
02-14 23:50:46.719 2469-4859/gimbi.edu.ba W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
02-14 23:50:46.719 2469-4859/gimbi.edu.ba W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
02-14 23:50:46.719 2469-4859/gimbi.edu.ba W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
02-14 23:50:46.719 2469-4859/gimbi.edu.ba W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
02-14 23:50:46.719 2469-4859/gimbi.edu.ba W/System.err﹕ at java.lang.Thread.run(Thread.java:818) 

Как я уже говорил там, я попытался удалить img element, но он одинаковый для всех элементов, когда я вызываю map.put методов.

ответ

2

Прочитайте об этом link относительно того, как Jsoup используется для извлечения данных.

Ниже приведен мой пример в соответствии с вашим сценарием.

Document doc = null; 
    Element aEle = null; 
    Element fontEle = null; 

    try { 
     doc = ...... 

     /** Get A tag that is under DIV with classname right_naslov **/ 
     aEle = doc.select("div.right_naslov > a").first(); 
     if (aEle != null) { 
      System.out.println("right_naslov content: " + aEle.ownText()); 
     } 

     /** Get Font tag with [classname=nadnaslov] under span[classname=right_post_nadnaslov] under div[lassname=right_post] **/ 
     /** Try to get Font[classname=naslov] with the following method **/ 
     fontEle = doc.select("div.right_post > span.right_post_nadnaslov > font.nadnaslov").first(); 
     if (fontEle != null) { 
      System.out.println("font nadnaslov content: " + fontEle.ownText()); 
     } 

     /** Get A tag that is under div[classname=right_post_tekst] under div[classname=right_post] **/ 
     aEle = doc.select("div.right_post > div.right_post_tekst > a").first(); 
     if (aEle != null) { 
      System.out.println("a href: " + aEle.attr("href")); 

      /** Get inner IMG tag with classname as 'novine_slika_thumbm' **/ 
      Element imgEle = aEle.select("img.novine_slika_thumbm").first(); 
      if (imgEle != null) { 
       System.out.println("img src: " + imgEle.attr("src")); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

выше пример будет работать только, если есть только один DIV[classname=right_naslov] или DIV[classname=right_post] в HTML-документ, который вы разборе как я использую Elements.first() в извлечении данных, что означает, что я всегда выбираю первый элемент, который соответствует нашим критериям извлечения. Попытайтесь поиграть с Jsoup, получайте удовольствие. Как только вы получите все данные, сохраните их в Hashmap или ArrayList, как вам нравится.


Обновлено

Что вы можете сделать, это выбрать несколько DIVs [имя_класса = right_post] с Document.select(), который возвращает вам Elements объект. Затем зациклируйте каждый Element, чтобы получить его внутренние данные. В моем следующем примере вы получите две цифры HashMap в переменной arraylist.

Есть div [classname = right_naslov], и я получаю только второй, который после раздела комментариев <!-- NOVINEEE -->. Есть div [classname = right_post], и я уже проигнорировал те, у которых нет внутреннего элемента span [classname = right_post_nadnaslov].

List<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>(); 
    Elements aEles = null; 
    Elements divRightPostEles = null; 
    String rightNaslov = null; 
    Document doc = null; 

    try { 
     doc = Jsoup.connect(url).get(); 

     /** Get A tag that is under DIV with classname right_naslov **/ 
     aEles = doc.select("div.right_naslov > a"); 
     if (aEles != null && aEles.size() > 0) { 
      if (aEles.size() == 2) 
       rightNaslov = aEles.get(1).ownText(); 
      else 
       rightNaslov = aEles.first().ownText(); 
     } 

     /** 
     * Since you say there are multiple DIV with right_post as 
     * classname, we will get all those right post elements and loop 
     * them one by one to retrieve its inner elements 
     **/ 
     divRightPostEles = doc.select("div.right_post"); 

     for (Element rightPostDiv : divRightPostEles) { 
      /** Each loop of this represents a right_post DIV element **/ 

      HashMap<String, String> map = new HashMap<String, String>(); 

      /** 
      * Get Font tag with [classname=nadnaslov] under 
      * span[classname=right_post_nadnaslov] under 
      * div[lassname=right_post] 
      **/ 
      /** Try to get Font[classname=naslov] with the following method **/ 
      Elements fontNadnaslov = rightPostDiv 
        .select("span.right_post_nadnaslov > font.nadnaslov"); 

      /** 
      * Get A tag that is under div[classname=right_post_tekst] under 
      * div[classname=right_post] 
      **/ 
      Element aRightPostTekst = rightPostDiv.select(
        "div.right_post_tekst > a[href]").first(); 

      // Retrive Jsoup Elements 
      if (fontNadnaslov != null && fontNadnaslov.size() > 0) { 
       map.put("country", fontNadnaslov.first().ownText()); 

       if (aRightPostTekst != null) { 
        map.put("population", aRightPostTekst.attr("href")); 

        Element img = aRightPostTekst.select("img[src]").first(); 

        if (img != null) 
         map.put("image", img.attr("src")); 
       } 

       if (rightNaslov != null) 
        map.put("rank", rightNaslov); 
       // Set all extracted Jsoup Elements into the array 
       arraylist.add(map); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

Существует несколько разделов с правом названия.Я попробовал обернуть его в функцию for, он возвращает в виде двух отдельных элементов представления списка, но у него есть все возможные права_post_nadnaslov и только один href (aEle). Как я могу заставить их казаться отдельными? Вот что я пытался сделать: http://pastebin.com/ZZse378K – dinomuharemagic

+0

Ответ обновлен. –

+0

Я заменил «input» и «doc.output», потому что «я ничего не мог импортировать, я заменил его на« Document doc = Jsoup.connect (url) .get(); »И я получаю следующую ошибку: http: //pastebin.com/6DH8iCxV, и он ссылается на ListViewAdapter (следующие строки): '@Override public int getCount() { return data.size(); } ', вот мой ListViewAdapter.java: http://pastebin.com/cZtsrDpL – dinomuharemagic

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