网络爬虫入门(二)-Jsoup解析
一.Jsoup介绍
- 一般来说我们对爬取的网页解析有两种方法
- 一种方法就是正则
- 另一种方法就是Jsoup解析
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据
二.Jsoup输入
- 从URL加载文档
- 使用Jsoup.connect()方法从URL加载HTML
//解析url地址,第一个参数是需要解析的url,第二个参数是连接的超时时间,单位是毫秒
Document document = Jsoup.parse(new URL("https://www.baidu.com"),10000);
//获取页面信息,输出为html文件
//FileUtils.writeStringToFile(new File("D:\\test.html"),document.html(),"UTF-8");
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
Document document = Jsoup.connect("https://blog.csdn.net/qq_33248299/article/details/82890539").get();
System.out.println(document.title());
- 从文件加载文档
Document document = Jsoup.parse(new File("D:\\test.html"),"UTF-8");
System.out.println(document.title());
- 把文件转字符串加载文档
String html = FileUtils.readFileToString(new File("D:\\test.html"),"UTF-8");
Document document = Jsoup.parse(html);
System.out.println(document.title());
- 从字符串加载文档
String html = "<html><head><title>First parse</title></head><body><p>Parsed HTML into a doc.</p></body></html>";
Document document = Jsoup.parse(html);
System.out.println(document.title());
虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际开发过程中,需要使用到多线程,连接池,代理等等技术,而jsoup对这些技术支持并不是很好,所以jsoup一般仅仅作为html解析工具使用
三.数据抽取
- 将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作
- Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据
1.从元素抽取属性,文本和HTML
String html = FileUtils.readFileToString(new File("D:\\test.html"),"UTF-8");
Document document = Jsoup.parse(html);
Elements links = document.select("a");
Element li = links.first();//抽取第一个元素
for(Element link:links){
System.out.println(link.attr("href"));//取得超链接中href对应的值
System.out.println(link.text());//取得超链接中的文本
}
2.使用选择器语法来查找元素
Elements links = document.select("a[href]");//带有href属性的a元素
Elements pngs = document.select("img[src$=.png]");//扩展名为.png的图片
Element masthead = document.select("div.masthead").first();//class等于masthead的div标签
3.遍历文档
根据id查询元素getElementById
根据标签获取元素getElementsByTag
根据class获取元素getElementsByClass
根据属性获取元素getElementsByAttribute
四.实例
- 我们来获取淘宝首页的主题市场这一排的标题以及其他的超链接
Document doc = Jsoup.connect("https://www.taobao.com").get();
Elements links = doc.select("div[class=tbh-nav J_Module tb-pass tb-bg ]");
for(Element link:links){
// System.out.println(link.text()); 其实这里可以直接打印 包含了这个div下所有的text
Elements as = link.select("a");
for(Element a:as){
System.out.println(a.attr("href"));
}
Elements lis = link.select("li");
for(Element li:lis){
System.out.println(li.text());
}
}