使用 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 得到它。
我正在尝试使用 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 得到它。