在前面几章,我已经对HttpClient的基本使用进行了总结,而且对于一般性的需要登录的网站大家怎么进行模拟登录也有了一定的了解,也就是说,通过前几篇的学习,你已经学会了通过HttpClient进行网站的访问,并且知道怎么返回网页的html,可是爬虫的需求一般都是在html中提取我们想要的信息,我们得到了网页的html,现在该怎么办呢?使用Jsoup,对html进行解析,可以说html的结构在Jsoup中也是一个树结构,其中的标签就是一个个节点,我们需要做的就是在这些节点中提取我们需要的信息。
对于html结构有疑惑的可以看一下我总结的这一篇博客Java网络爬虫–HTML DOM(HTML 基础)。
使用Jsoup返回网页源码
在前面我说过使用HttpClient可以返回页面的源码,来供我们进行解析使用,但是要通过HttpClient返回一个网页源码往往要通过建立客户端,构造请求,(模拟浏览器行为),执行请求,返回源码等多个步骤,这就会使效率下降,并且代码也会出现冗余,有快捷方便的访问,如果我们不是对一个页面进行多次请求,那么就可以使用Jsoup返回网页源码:
Document document = Jsoup.connect(url).timeout(10000).get();
这个代码返回就是请求url的网页源码,并且已目录树的格式进行了存储,其中的timeout设置的是请求相应时间,单位是ms,如果在10s内网页请求没有反映则进行异常处理。
使用Jsoup进行html字符串的解析
一般来说,当我们使用HttpClient进行了网页的请求,得到网页的实体内容之后,会将它以字符串的形式进行返回,这个时候我们还是需要Jsoup进行解析,具体的代码如下:
Document document = Jsoup.parse(html);
我们还可以使用parse(String html, String baseUri)这个方法,它能够将输入的HTML解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对URL,并指定从哪个网站获取文档。对于这个方法你在需要用到的时候就会自然明白它的用处,这里不再做过多的文字描述。
使用Jsoup从一个文件加载一个文档
假设我们现在不是从网页中获取源码而是我们电脑本地就有一个html文档,现在需要对它进行解析,我们就可以使用静态 Jsoup.parse(File in, String charsetName, String baseUri) 方法:
File file = new File("/tmp/example.html");
Jsoup.parse(file, "utf8", "http://... ...");
parse(File in, String charsetName, String baseUri) 这个方法用来加载和解析一个HTML文件。如在加载文件的时候发生错误,将抛出IOException,应作适当处理。
baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串。
另外还有一个方法parse(File in, String charsetName) ,它使用文件的路径做为 baseUri。 这个方法适用于如果被解析文件位于网站的本地文件系统,且相关链接也指向该文件系统。