这里是jsoup的API文档链接:https://jsoup.org/apidocs/
前几天还在使用htmlparser来爬虫的我,现在我要因为jsoup跟htmlparser道别了,毕竟htmlparser的最新版是在十年前出的,而现在有更优秀的解析器的出现了。为什么说jsoup这么好?
1.获取工具包的方式
从获取它的jar包的方式,就已经让我对它产生了好感,人的第一感觉十分重要,筛选工具时同样会有第一感觉。
如何获取jsoup的jar包呢?
把你的工程设置成maven的属性的项目
这里是jsoup的下载地址:https://mvnrepository.com/artifact/org.jsoup/jsoup/1.10.2
点开链接获取指定的代码,然后按下面指示操作就可以导入jar包了。
完全不需要下载文件,而且导入几个jar包都是这么方便,再也不用担心下载不了文件或者找不到下载文件了。
2.熟悉和简便的语言风格
它的语言风格与javaScript和jQuery很相似,如果你懂得html语言,那么给你的感觉就是在写html的代码或者就是在写JavaScript的代码。
只需要简单的几行代码就可以从许多信息的网页中精准获取你想要的信息,无论是获取连接还是过滤信息的过程,都只是几行代码就可以解决的事情。
3.强大的过滤器(也是最重要的原因)来看看几个强大的方法:
Elements对象下的方法
(1).getElementById(String id)
根据id属性的属性值来获取元素
(2).getElementByAttribute(String key)
根据属性名key来获取元素
例:getElementByAttribute("value")
获取有value属性的所有元素
(3).getElementByAttributeValue(String key,String value)
根据属性名key=value这个属性值来获取元素
例:getElementByAttributeValue("name","abc")
获取属性name=abc的元素
(4).getElementByAttributeValueContaining(String key,String match)
根据属性名key的属性值 包含 match属性值来获取元素
例:getElementByAttributeValueContaining(name,a)
获取属性name的值 包含 a的元素
(5).getElementByAttributeValueStarting(String key,String valuePrefix)
根据属性名key的属性 以valuePrefix开头的属性值来获取元素
例:getElementByAttributeValueStarting(class,red)
获取属性class的值以red开头的元素
这里都是过滤元素的方法(详情去查看API文档 点击打开链接):
4.介绍了这么多,下面来演示jsoup的强大之处并且与htmlparser进行对比
来个简单的任务,获取这个网页的图片的下载地址:
分析网页的源代码:
使用htmlparser代码:
public static void getDownloadUrl(String introUrl){ String downloadUrl=""; try { Document doc=Jsoup.connect(introUrl).get(); Element element=doc.getElementById("J_worksImg"); downloadUrl=element.attr("src"); System.out.println(downloadUrl); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { getDownloadUrl("http://www.nipic.com/show/15949460.html"); }
使用jsoup代码:
public static void getDownloadUrl(String introUrl){ String downloadUrl=""; try { Document doc=Jsoup.connect(introUrl).get(); Element element=doc.getElementById("J_worksImg"); downloadUrl=element.attr("src"); System.out.println(downloadUrl); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { getDownloadUrl("http://www.nipic.com/show/15949460.html"); }
显然,htmlparser的代码比较复杂,而且行数也比较多,使用的方法也难记,方法名也很难让用户理解方法的用途。
jsoup的代码看起来很简练,方法名也容易理解,即便第一次使用也容易掌握。
5.这个还不能体现出jsoup的强大之处,我们把抓取信息的难度调大一点。
场景:
上次我们已经学会获取一个电影网页的所有介绍地址,然后再获取每个电影的下载地址,这次我们把电影网站的所有分页都获取过来,循环一下就可以获取所有的电影下载地址。
下一步我们就来分析如何获取所有分页的地址:
(查看并分析网页的源代码)
分析1:
分析2:
jsoup代码示例:
public static void getAllPage(String url) { try { Document doc=Jsoup.connect(url).get(); Elements elements=doc.getElementsByAttributeValueContaining("value", "list"); for (int i = 0; i < elements.size(); i++) { Element e=elements.get(i); System.out.println("http://www.ygdy8.net/html/gndy/dyzz/"+e.attr("value")); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { getAllPage("http://www.ygdy8.net/html/gndy/dyzz/index.html"); }
htmlparser代码示例:
public static void getAllPage(String url) { try { Parser parser = new Parser(url); NodeList list=parser.extractAllNodesThatMatch(new TagNameFilter("option")); for(int i=0;i<list.size();i++){ Tag tag=(Tag) list.elementAt(i); String tmp=tag.getAttribute("value"); if(tmp.contains("list")){ System.out.println("http://www.ygdy8.net/html/gndy/dyzz/"+tmp); } } } catch (ParserException e) { e.printStackTrace(); } } public static void main(String[] args) { getAllPage("http://www.ygdy8.net/html/gndy/dyzz/index.html"); }
关于jsoup更多的使用可以到一下地址查看: