当前位置: 首页 > 知识库问答 >
问题:

在arraylist中使用Jsoup进行解析

富波光
2023-03-14
    <!-- 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>
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

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)

共有1个答案

邵捷
2023-03-14

关于如何使用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();
    }

上面的示例只有在您解析的HTML文档中只有一个div[classname=right_naslov]div[classname=right_post]的情况下才起作用,因为我使用elements.first()提取数据,这意味着我总是选择符合提取标准的第一个元素。试着玩Jsoup,玩得开心。获取所有数据后,根据需要将它们存储在HashMapArrayList中。

    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();
    }
 类似资料:
  • 问题内容: 有人可以给我看一个简单的示例,如何使用新的lambda语法在Java 8中按字母顺序排序。 问题答案: 对于字符串,这将工作

  • 我想解析出这个Nasa页面上的描述,页面底部的文字 我该怎么做?

  • 我试图在这里使用JSOUP解析html标记。我对jsoup是新来的。基本上,我需要解析这些标记,获取这些标记中的文本,并应用class属性中提到的样式。 我正在创建一个SpannableStringBuilder,它可以创建子字符串,应用样式,并将它们附加到没有样式的文本中。 我不确定如何解析不在任何标记之间的字符串,例如“there are”和“worker from the”。 需要输出,例如

  • 问题内容: 我正在解析我的代码。但是在检索已解析的数据时遇到了一些意外的问题。所以,让我解释一下我的问题。 我必须使用xcode 解析以下数据。这是我在浏览器中命中相同URL时要解析的数据的样子: 我要获取此数据的代码如下: 如果我使用来打印对象,即它看起来像: 因此,在这里我观察到两件事: 键(或节点)的序列(,和)被改变相比上述网络响应为。 将被括在大括号中。 现在,如果我将键&和 它们的值分

  • 我正在尝试使用JSOUP解析来自特定网站的信息。到目前为止,我可以解析和显示单行,因为网站有很多html,我对此很陌生,我想知道有没有一种方法可以解析包含单词“fixturerow”的页面上的所有表行。 下面是我的解析器代码: 谢谢你抽出时间!

  • 我试图将文本存储在ArrayList中div内的p元素中。HTML如下所示: 我尝试了以下代码,但它连接了上述所有代码,并将它们存储为一个,而不是单独存储: 我到底做错了什么?谢谢。