Jsoup
Jsoup是一款java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup主要功能
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找,取出数据;
- 可操作HTML元素、属性、文本;
入门程序
解析url
1.导入依赖
<!-- jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- fileUtils -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
<!-- StringUtils -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
2.代码
@Test
public void testUrl() throws Exception{
//解析url地址
//第一个参数:访问的url;第二个参数:访问的超时时间(单位:毫秒)
Document document = Jsoup.parse(new URL("http://www.itcast.cn"), 1000);
//使用标签选择器,获取title标签中的内容
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
}
解析字符串
@Test
public void testString() throws Exception{
//使用工具类读取文件,获取字符串
String content = FileUtils.readFileToString(new File("C:\\Users\\888\\Desktop\\itcast.html"), "utf8");
//解析字符串
Document document = Jsoup.parse(content);
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
}
解析文件
@Test
public void testFile()throws Exception{
//解析文件
Document document = Jsoup.parse(new File("C:\\Users\\888\\Desktop\\itcast.html"), "utf8");
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
}
使用dom方式遍历文档
元素获取
- 根据id查询元素getElementById
- 根据标签获取元素getElementsByTag
- 根据class获取元素getElementsByClass
- 根据属性获取元素getElementsByAttribute
@Test
public void testDOM()throws Exception{
//解析文件,获取Document对象
Document document = Jsoup.parse(new File("C:\\Users\\888\\Desktop\\itcast.html"), "utf8");
// - 根据id查询元素getElementById
Element myMessage = document.getElementById("myMessage");
System.out.println("根据id获取元素:"+myMessage.text());
// - 根据标签获取元素getElementsByTag
Elements elements = document.getElementsByTag("li");
for (Element e :
elements) {
System.out.println("根据tag获取元素:"+e.text());
}
// - 根据class获取元素getElementsByClass
Elements elements1 = document.getElementsByClass("fl clear");
for (Element e :
elements1) {
System.out.println("根据class获取元素:"+e.text());
}
// - 根据属性获取元素getElementsByAttribute
Element element = document.getElementsByAttributeValue("href", "/course").first();
System.out.println("根据Attribute获取元素:"+element.text());
}
元素中获取数据
- 从元素中获取id
- 从元素中获取className
- 从元素中获取属性的值attr
- 从元素中获取所有属性attributes
- 从元素中获取文本内容text
@Test
public void testData()throws Exception{
// 元素中获取数据
Document document = Jsoup.parse(new File("E:\\学习\\文件夹\\自学系列\\spider\\itcast.html"), "utf8");
Element testDiv = document.getElementById("testDiv");
// - 从元素中获取id
String id = testDiv.id();
System.out.println("id:"+id);
// - 从元素中获取className
Set<String> classNames = testDiv.classNames();
for (String s:
classNames) {
System.out.println("类名:"+s);
}
// - 从元素中获取属性的值attr
String attrId = testDiv.attr("id");
System.out.println("attrId:"+attrId);
String attrClass = testDiv.attr("class");
System.out.println("attrClass:"+attrClass);
// - 从元素中获取所有属性attributes
Attributes attributes = testDiv.attributes();
System.out.println("attributes:"+attributes.toString());
// - 从元素中获取文本内容text
String content = testDiv.text();
System.out.println("content:"+content);
}
Selector选择器
- tagname:通过标签查找元素,比如:span
- #id:通过ID查找元素,比如:#city_bj
- .class:通过class名称查找元素,比如:.class_a
- [attribute]:利用属性查找元素,比如:[abc]
- [attr=value]:利用属性值来查找元素,比如:[class=s_name]
@Test
public void testSelector()throws Exception{
//解析html文件
Document document = Jsoup.parse(new File("E:\\学习\\文件夹\\自学系列\\spider\\itcast.html"), "utf8");
// - tagname:通过标签查找元素,比如:span
Elements lis = document.select("li");
for (Element element:lis){
System.out.println("标签li:"+element.text());
}
// - #id:通过ID查找元素,比如:#city_bj
Elements select = document.select("#testDiv");
System.out.println("通过ID查找元素:"+select.text());
// - .class:通过class名称查找元素,比如:.class_a
Elements select1 = document.select(".fr");
System.out.println("通过class名称查找元素:"+select1.get(0).text());
// - [attribute]:利用属性查找元素,比如:[abc]
Elements select2 = document.select("[style]");
System.out.println("利用属性查找元素:"+select2.first().text());
// - [attr=value]:利用属性值来查找元素,比如:[class=s_name]
Elements select3 = document.select("[class=fr clearfix]");
System.out.println("利用属性值来查找元素:"+select3.text());
}
Selector选择器组合使用
- el#id:元素+ID,比如:h3#city_bj
- el.class:元素+class,比如:li.class_a
- el[attr]:元素+属性名,比如:span[abc]
- 任意组合:比如:span[abc].s_name
- ancestor child:查找某个元素下子元素,比如:.city_con li查找"city_con"下的所有li
- parent>child:查找某个父元素下的直接子元素,比如:.city_con>ul>li查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
- parent>*:查找某个父元素下所有直接子元素
@Test
public void testSelector2()throws Exception{
//解析html文件
Document document = Jsoup.parse(new File("E:\\学习\\文件夹\\自学系列\\spider\\itcast.html"), "utf8");
// - el#id:元素+ID,比如:h3#city_bj
Elements select = document.select("div#testDiv");
System.out.println("元素+ID:"+select.text());
// - el.class:元素+class,比如:li.class_a
Elements select1 = document.select("li.A");
System.out.println("元素+class:"+select1.text());
// - el[attr]:元素+属性名,比如:span[abc]
Elements select2 = document.select("li[class]");
System.out.println("元素+属性名:"+select2.text());
// - 任意组合:比如:span[abc].s_name
Elements select3 = document.select("li[class].A");
System.out.println("任意组合:"+select3.text());
// - ancestor child:查找某个元素下子元素,比如:.city_con li查找"city_con"下的所有li
Elements select4 = document.select(".fr li");
System.out.println("查找某个元素下子元素:"+select4.first().text());
// - parent>child:查找某个父元素下的直接子元素,比如:.city_con>ul>li查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
Elements select5 = document.select(".fr>ul>li");
System.out.println("查找某个父元素下的直接子元素:"+select5.first().text());
// - parent>*:查找某个父元素下所有直接子元素
Elements select6 = document.select("div>*");
System.out.println("查找某个父元素下所有直接子元素:"+select6.first().text());
}