项目结构
配置文件
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.xiaoge</groupId> <artifactId>xiaoge-crawler-first</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 自动的抓取数据的jar包, httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <!-- 日志信息 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <!--<scope>test</scope>--> </dependency> <!-- jsoup包 --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version> </dependency> <!-- Junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- 工具commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.7</version> </dependency> <!-- 工具commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> </dependencies> </project>
-
log4j.properties
log4j.rootLogger=DEBUG,A1 log4j.logger.cn.itcast=DEBUG # 在控制台显示日志 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
前台文件
-
test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSDN - 专业开发者社区</title> </head> <body> <div class="city"> <h3 id="city_bj">北京中心</h3> <img src="/2018czgw/images/slogan.jpg/" class="slogan" /> <div class="city_in"> <div class="city_con" style="display: none;"> <ul> <li id="test" city="北京" class="class_a class_b"> <a href="https://www.csdn.net/" target="_blank"> <span class="s_name">北京</span> </a> </li> <li> <a href="https://www.csdn.net/" target="_blank"> <span class="s_name">上海</span> </a> </li> <li> <a href="https://www.csdn.net/" target="_blank"> <span abc="123" class="s_name">广州</span> </a> </li> <ul> <li>天津</li> </ul> </ul> </div> </div> </div> </body> </html>
测试文件
-
JsoupFirstTest
package jsoup; import org.apache.commons.io.FileUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.junit.Test; import java.io.File; import java.net.URL; import java.util.Set; /** * @Author: 潇哥 * @DateTime: 2020/9/24 下午11:16 * @Description: TODO */ public class JsoupFirstTest { /** * 解析一个url * @throws Exception */ @Test public void testUrl() throws Exception { // 解析url地址, 第一个参数是访问的url, 第二个参数是访问时候的超时时间/单位毫秒 Document document = Jsoup.parse(new URL("https://www.csdn.net/"), 1000); // 使用标签选择器, 获取title标签中的内容 String title = document.getElementsByTag("title").first().text(); // 打印 System.out.println(title); } /** * 读取文件, 解析字符串 * @throws Exception */ @Test public void testString() throws Exception { // 使用工具类读取文件, 获取字符串 String content = FileUtils.readFileToString(new File("/Users/xiaoge/IdeaProjects" + "/xiaoge-crawler-first/target/classes/template/test.html"), "utf8"); // 解析字符串 Document document = Jsoup.parse(content); // 使用标签选择器, 获取title标签中的内容 String title = document.getElementsByTag("title").first().text(); // 打印 System.out.println(title); } /** * 解析文件 * @throws Exception */ @Test public void testFile() throws Exception { // 解析文件 Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" + "target/classes/template/test.html"), "utf8"); // 获取该文本中 title标签中的内容 String title = document.getElementsByTag("title").first().text(); System.out.println(title); } /** * 获取元素的方法 * @throws Exception */ @Test public void testDom() throws Exception { // 解析文件, 获取document对象 Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" + "target/classes/template/test.html"), "utf8"); // 获取元素 // 1. 根据id查询元素getElementById String cityBj = document.getElementById("city_bj").text(); System.out.println("获取到的元素内容是: " + cityBj); // 2. 根据标签获取元素getElementsByTag String span = document.getElementsByTag("span").first().text(); System.out.println("获取到的第一个元素内容是: " + span); // 3. 根据class获取元素getElementsByClass String classAClassB = document.getElementsByClass("class_a class_b").first().text(); System.out.println("获取到的第一个元素内容是: " + classAClassB); String classA = document.getElementsByClass("class_a").first().text(); System.out.println("获取到的第一个元素内容是: " + classA); String classB = document.getElementsByClass("class_b").first().text(); System.out.println("获取到的第一个元素内容是: " + classB); // 4. 根据属性获取元素getElementsByAttribute String abc = document.getElementsByAttribute("abc").first().text(); System.out.println("获取到的第一个元素内容是: " + abc); } /** * 根据元素获取元素数据 * @throws Exception */ @Test public void testData() throws Exception{ // 解析文件, 获取Document Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" + "target/classes/template/test.html"), "utf8"); // 根据id获取元素 Element element = document.getElementById("test"); // 元素中获取数据: // 1. 从元素中获取id String id = element.id(); System.out.println("获取到的数据是: " + id); // 2. 从元素中获取className String className = element.className(); System.out.println("获取到的数据是: " + className); Set<String> classNames = element.classNames(); System.out.println("获取到的数据是: " + classNames); // 3. 从元素中获取属性值的attr String city = element.attr("city"); System.out.println("获取到的数据是: " + city); String attrId = element.attr("id"); System.out.println("获取到的数据是: " + attrId); // 4. 从元素中获取所有属性attributes String attrs = element.attributes().toString(); System.out.println("获取到的数据是: " + attrs); // 5. 从元素中获取文本内容text String text = element.text(); System.out.println("获取到的数据是: " + text); } /** * 使用选择器获取元素 * @throws Exception */ @Test public void testSelector() throws Exception{ // 解析html文件, 获取Document对象 Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" + "target/classes/template/test.html"), "utf8"); // tagname: 通过标签查找元素, 比如: span String span = document.select("span").first().text(); System.out.println("获取到的数据是: " + span); // #id: 通过ID查找元素, 比如: #city_bj String cityBj = document.select("#city_bj").first().text(); System.out.println("获取到的数据是: " + cityBj); // .class: 通过class名称查找元素, 比如: .class_a String classA = document.select(".class_a").first().text(); System.out.println("获取到的数据是: " + classA); // [attribute]: 利用属性查找元素, 比如: [abc] String abc = document.select("[abc]").first().text(); System.out.println("获取到的数据是: " + abc); // [attr=value]: 利用属性值来查找元素, 比如: [class=s_name] String classSName = document.select("[class=s_name]").first().text(); System.out.println("获取到的数据是: " + classSName); } /** * 使用组合选择器获取元素 * @throws Exception */ @Test public void testSelector2() throws Exception{ // 解析html文件, 获取Document对象 Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" + "target/classes/template/test.html"), "utf8"); // el#id: 元素+ID, 比如: h3#city_bj String cityBj = document.select("h3#city_bj").first().text(); System.out.println("获取到的内容是: " + cityBj); // el.class: 元素+class, 比如: li.class_a String classA = document.select("li.class_a").first().text(); System.out.println("获取到的内容是: " + classA); // el[attr]: 元素+属性名, 比如: span[abc] String spanAbc = document.select("span[abc]").first().text(); System.out.println("获取到的内容是: " + spanAbc); // 任意组合: 比如: span[abc].s_name String spanAbcSName = document.select("span[abc].s_name").first().text(); System.out.println("获取到的内容是: " + spanAbcSName); // ancestor child: 查找某个元素下子元素, 比如: .city_con li 查找"city_con"下的所有li String cityConLi = document.select(".city_con li").first().text(); System.out.println("获取到的内容是: " + cityConLi); // parent > child: 查找某个父元素下的直接子元素, 比如: .city_con > ul > li // 查找 city_con 第一级(直接子元素) 的ul, 再找所有ul下的第一级li String cityConUlLi = document.select(".city_con > ul > li").first().text(); System.out.println("获取到的内容是: " + cityConUlLi); /* String cityConLi2 = document.select(".city_con > li").first().text(); 会抛出空指针异常, 因为 .city_con是在div中的class div一级子元素没有li而是ul */ // System.out.println("获取到的内容是: --" + cityConLi2); // parent > *: 查找某个父元素下所有直接子元素 Elements elements = document.select("ul > li"); for (Element element : elements) { System.out.println("获取到的内容是: " + element.text()); } } }