如何从网页使用 Jsoup 检索特定的表 [ Android ]

标签: jsoup Java Android
发布时间: 2017/3/19 18:50:28
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图从URL 检索表。这是我需要检索的表︰

 <table id="h2hSum" class="competitionRanking tablesorter"> 
              <thead> 
               <tr> 
                <th align="center">Team</th> 
                <th align="center">Played</th> 
                <th align="center">Win</th> 
                <th align="center">Draw</th> 
                <th align="center">Lose</th> 
                <th align="center">Score</th> 
                <th>Goals Scored</th> 
                <th>Goals Allowed</th> 
               </tr> 
              </thead> 
              <tbody> 
               <tr> 
                <td><a class="teamLink" href="/soccer-statistics/England/Premier-League-2016-2017/team_info_overall/676_Manchester_City_FC">Manchester City</a></td> 
                <td>140</td> 
                <td>47</td> 
                <td>38</td> 
                <td>55</td> 
                <td>188:205</td> 
                <td>1.34</td> 
                <td>1.46</td> 
               </tr> 
               <tr class="odd"> 
                <td><a class="teamLink" href="/soccer-statistics/England/Premier-League-2016-2017/team_info_overall/661_Chelsea_FC">Chelsea</a></td> 
                <td>140</td> 
                <td>55</td> 
                <td>38</td> 
                <td>47</td> 
                <td>205:188</td> 
                <td>1.46</td> 
                <td>1.34</td> 
               </tr> 
              </tbody> 
             </table>

这是我的尝试︰

private class SimpleTask1 extends AsyncTask<String, String, String>
{
    ProgressDialog loader;


    @Override
    protected void onPreExecute()
    {
        loader = new ProgressDialog(MainActivity.this, ProgressDialog.STYLE_SPINNER);
        loader.setMessage("loading engine");
        loader.show();

    }

    protected String doInBackground(String... urls)
    {
        String result1 = "";
        try {

            Document doc = Jsoup.connect(urls[0]).get();
            Element table = doc.select("table[class=competitionRanking tablesorter]").first();
            Iterator<Element> ite = table.select("td").iterator();

            ite.next();
            Log.w("Value 1: ",""+ ite.next().text());
            Log.w("Value 2: ",""+ ite.next().text());
            Log.w("Value 3: ",""+ ite.next().text());
            Log.w("Value 4: ",""+ ite.next().text());

        } catch (IOException e) {

        }
        return result1;
    }

    protected void onPostExecute(String sampleVal)
    {
        loader.dismiss();
        Log.e("OUTPUT",""+sampleVal);



    }




}

不过,这将引发异常,我试过类似的答案,但答案相同表的访问使用他们的类名称或 td 宽度。 所以,我可以访问该表中的所有值,该怎么办?请帮助。

解决方法 1:

问题

Iterator<Element> ite = table.select("td").iterator();引发NullPointerException

原因

该网站的初始访问后,他们似乎存储您的 ip 和注册要求的第二次访问,如果你 activity 是类似于 bot。你会被重定向到登录页面不包含表,所以 tablenull ,你不能叫 select(...)null

解决方案

注册为 service 和插入到代码中的登录过程或使用代理 switch ip address 如果你被重定向到注册页面。 不确定多长时间 ip 获取阻止,但我使用 vpn 和下面的代码没有任何做 20 的连续查询的问题。所以请务必设置一个用户代理,饼干和其他标头字段中包含在原始站点请求 (例如监视与开发人员的工具/网络工具 browser ):

代码

String userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";
Response res = Jsoup
        .connect("http://www.soccerpunter.com/soccer-statistics/England/Premier-League-2016-2017/")
        .followRedirects(true).userAgent(userAgent).referrer("http://www.soccerpunter.com")
        .method(Method.GET).header("Host", "http://www.soccerpunter.com").execute();

Document doc = Jsoup
        .connect("http://www.soccerpunter.com/soccer-statistics/England/Premier-League-2016-2017/head_to_head_statistics/all/676_Manchester_City_FC/661_Chelsea_FC")
        .userAgent(userAgent).timeout(10000).header("Host", "http://www.soccerpunter.com")
        .cookies(res.cookies())
        .referrer("http://www.soccerpunter.com/soccer-statistics/England/Premier-League-2016-2017/")
        .get();

Elements td = doc.select("table.competitionRanking.tablesorter").first().select("td");
赞助商