使用 Java 和 jsoup 进行网站抓取; html无法读取;空指针异常

Website Scraping with Java and jsoup; html can not be read; nullPointerException

我正在尝试使用 Java 和 jsoup 从网站抓取数据。我的程序的主要目的是从 table 中读取数据。不幸的是,该代码适用于 table 之类的简单示例 this。但不适用于代码中的其他人。

 import org.jsoup.*;
 import org.jsoup.helper.*;
 import org.jsoup.nodes.*;
 import org.jsoup.select.*;
 import java.io.*; // Only needed if scraping a local File.
 import java.util.*;

 public class Test1 {
    public static void main(String args[]) throws IOException { 
        try{

            Document doc = Jsoup.connect("http://www.truckit.net/freight/details/index/id/62674").timeout(10*1000).get();
            String title = doc.title();

            Element table = doc.getElementById("table");
            Elements rows = table.getElementsByTag("tr");

            for (Element row : rows) {
                Elements tds = row.getElementsByTag("td");
                for (int i = 0; i < tds.size(); i++) {
                    if (i == 1) System.out.println(tds.get(i).text());
                }
            }                           
        }
        catch (java.io.IOException ex) {
            System.out.println("IO Error: " + ex);
            }
    }       
}

控制台输出如下:

Exception in thread "main" java.lang.NullPointerException
at Test1.main(Test1.java:30)

我阅读了很多关于空指针异常的帖子,但它并没有真正帮助我。我知道变量 table = null,因此变量 tr 也是,但这是为什么呢?由于我的程序适用于其他网站,我的问题可能与网站 html 代码有关吗?

这是因为 link 中的页面没有将属性 id 设置为 "table"

的元素

这意味着您必须为 JSoup 创建一个不同的钩子来锁定数据。

表格很少会设置 id="table" 属性,因为它是多余的。

因此通常你最好使用

Elements tables = doc.getElementsByTag("table");

而不是:

Element table = doc.getElementById("table");

特别是因为该页面可能有多个可用表格(如您提到的网站中的情况)

另请注意,抓取是个案交易,这意味着每个抓取工具都必须针对特定网站或页面量身定制,这意味着没有万能的方法随处可用的刮板。

在尝试抓取数据之前,您应该检查要抓取的页面结构(通过查看页面源选项),然后决定要抓取哪些数据以及通过 DOM 得到它。