目录
1、Jsoup解析HTML
Jsoup 依赖于 CSS 选择器与 jQuery 方法来操作 HTML 文件中的数据。使用 Jsoup 之前,需要了解 Jsoup 中的 Node、Element 和 Document 的概念。
- 节点(Node):HTML 文件中所包含的内容都可以看成一个节点。节点有很多种类 型,如属性(Attribute)节点、注释(Note)节点、文本(Text)节点和元素(Element) 节点等。解析 HTML 文件的过程,实际上就是对节点进行操作的过程。
- 元素(Element):节点的子集,所以一个元素也是一个节点。
- 文档(Document):整个 HTML 文档的源码内容。
1.1解析静态HTML文件
给定 HTML 字符串,可以使用 org.jsoup.Jsoup 类中的 parse(String html)方法,将 String 类型的 HTML 文件转化成 Document 类型。之后,可以使用 org.jsoup.nodes.Element 类 中的 select(String cssQuery)方法定位到所要解析的元素。
public class JsoupParseStaticFile {
public static void main(String[] args) {
//HTML静态文件
String html = "<html><body><div id=\"w3school\"> <h1>浏览器 脚本教程</h1> <p><strong>从左侧的菜单选择你需要的教程!</strong></p> </div>"
+ "<div> <div id=\"course\"> <ul> <li><a href=\"/ js/index.asp\" title=\"JavaScript 教 程 \">JavaScript</a></li> </ul> </div> </body></html>";
//转化成Document
Document document = Jsoup.parse(html);
//基于CSS选择器获取元素
Element element = document.select("div[id=w3school]").get(0);
System.out.println("元素内容为:\n" + element);
}
}
元素内容为:
<div id="w3school">
<h1>浏览器 脚本教程</h1>
<p><strong>从左侧的菜单选择你需要的教程!</strong></p>
</div>
1.2、解析URL加载的Document
指定 URL,可先使用 Jsoup 请求 URL,获取对应的 Document。之后,再使用 select (String cssQuery)方法定位要解析的内容。
public class JsoupParseURLDoc {
public static void main(String[] args) throws IOException {
//获取URL对应的Document
Document doc = Jsoup.connect("https://m.runoob.com/java/")
.timeout(5000)
.get();
//基于CSS选择器获取元素,这里换了一种方式
Element element = doc.select("#content > div:nth-child(1) > a > h2").get(0);
System.out.println("输出解析的元素内容为:");
System.out.println(element);
//从Element提取内容(抽取一条Node对应的信息)
String text1 = element.text();
System.out.println("文本信息:" + text1);
String className = element.className();
System.out.println("class:" + className);
}
}
输出解析的元素内容为:
<h2 class="entry-title">Java 教程</h2>
文本信息:Java 教程
class:entry-title
1.3、Jsoup遍历元素
org.jsoup.nodes.Element 类中的 select(String cssQuery)方法返回的是 Elements 对象,即匹配得到 cssQuery 对应的所有元素集合。org.jsoup.select.Elements 类继承 了 ArrayList,所以,可以按照操作 ArrayList 集合的方式操作 Elements 对象,如获取某元素可使用 get(int index)方法。 同样,也可以按照遍历 ArrayList 集合的方式遍历 Elements 对象。
遍历获取菜鸟教程的课程URL,页面HTML如下:
public class JsoupParseEveryEle {
public static void main(String[] args) throws IOException {
//获取URL对应的Document
Document doc = Jsoup.connect("https://www.runoob.com").timeout(5000).get();
//层层定位到要解析的内容,可以发现包含多个li元素
Elements elements = doc.select("body > div.container.main > div > div.col.middle-column-home > div.codelist.codelist-desktop.cate1").select("a");
//遍历每一个li节点
for (Element ele : elements) {
String title = ele.select("h4").text();
String describe = ele.select("strong").text();
String url = ele.attr("href");
System.out.println("标题为:" + title);
System.out.println("描述为:" + describe);
System.out.println("URL为:" + url);
System.out.println();
}
}
}
标题为:【学习 HTML】
描述为:HTML,即超文本标记语言(Hyper Text Markup Language)
URL为://www.runoob.com/html/html-tutorial.html
标题为:【学习 HTML5】
描述为:HTML5 是下一代 HTML 标准
URL为://www.runoob.com/html/html5-intro.html
标题为:【学习 CSS】
描述为:层叠样式表(Cascading StyleSheet)
URL为://www.runoob.com/css/css-tutorial.html
标题为:【学习 CSS3】
描述为:CSS3是CSS技术的升级版本
URL为://www.runoob.com/css3/css3-tutorial.html
标题为:【学习 Bootstrap3】
描述为:Bootstrap,来自 Twitter,是目前最受欢迎的前端框架
URL为://www.runoob.com/bootstrap/bootstrap-tutorial.html
标题为:【学习 Bootstrap4】
描述为:Bootstrap4 前端框架
URL为://www.runoob.com/bootstrap4/bootstrap4-tutorial.html
标题为:【学习 Bootstrap5】
描述为:Bootstrap5 目前是 Bootstrap 的最新版本
URL为://www.runoob.com/bootstrap5/bootstrap5-tutorial.html
标题为:【学习 Font Awesome】
描述为:Font Awesome 是一套绝佳的图标字体库和CSS框架。
URL为://www.runoob.com/font-awesome/fontawesome-tutorial.html
标题为:【学习 Foundation】
描述为:Foundation 用于开发响应式的 HTML, CSS and JavaScript 框架
URL为://www.runoob.com/foundation/foundation-tutorial.html
1.4、Jsoup获取元素的其它方法
方法 | 描述 |
---|---|
Element getElementById(String id) | 基于 id 获取元素 |
Elements getElementsByTag(String tagName) | 基于标签名称获取元素集合 |
Elements getElementsByAttribute(String key) | 基于属性名称获取元素集合 |
Elements getElementsByClass(String className) | 基于类名获取元素集合 |
Elements getElementsByAttributeStarting(StringkeyPrefix) | 通过属性前缀获取元素集合 |
Elements getElementsByAttributeValue(String key,String value) | 基于属性和属性值获取元素集合 |
Elements getElementsByAttributeValueStarting(String key, String valuePrefix) | 基于属性和属性值前缀获取元素集合 |
Elements getElementsByAttributeValueEnding(String key, String valueSuffix) | 基于属性和属性值后缀获取元素集合 |
Elements getElementsByAttributeValueContaining(String key, String match) | 基于属性与属性值(包含某字符串)获取元素集合 |
Elements getElementsByAttributeValueMatching(String key, String regex) | 基于属性与属性值(正则表达式)获取元素集合 |
Elements siblingElements() | 获取兄弟元素集合,如果没有返回空列表 |
Element nextElementSibling() | 获取下一个兄弟元素,如果没有返回 null |
Element previousElementSibling() | 获取上一个兄弟元素,如果没有返回 null |
Element firstElementSibling() | 获取第一个兄弟元素 |
Element lastElementSibling() | 获取最后一个兄弟元素 |
Elements children() | 获取子元素集合 |
2、支持Xpath语法的JsoupXpath
Jsoup 在选择节点或元素时,支持的是 CSS 选择器,而不支持 Xpath 语法。而 JsoupXpath 则是在 Jsoup 的基础上扩展的支持 Xpath 语法的 HTML 文件解析器。
使用 JsoupXpath 解析 HTML 文件之前,需要在 Maven 工程的 pom.xml 文件中添 加 JsoupXpath 对应的 dependency。
<dependency>
<groupId>cn.wanghaomiao</groupId>
<artifactId>JsoupXpath</artifactId>
<version>2.2</version>
</dependency>
在 JsoupXpath 解析 HTML 时,可以先通过 JXDocument 类中提供的 4 种方法实例化 JXDocument 对象,如程序所示。这四种方法传递的参数分别是 Document 类型 的 HTML 文档、Elements 类型的元素集合、String 类型的 HTML 字符串和 String 类型 的 URL。
public static JXDocument create(Document doc){
Elements els = doc.children();
return new JXDocument(els);
}
public static JXDocument create(Elements els){
return new JXDocument(els);
}
public static JXDocument create(String html){
Elements els = Jsoup.parse(html).children();
return new JXDocument(els);
}
public static JXDocument createByUrl(String url){
Elements els;
try {
els = Jsoup.connect(url).get().children();
} catch (Exception e) {
throw new XpathParserException("url ",e);
}
return new JXDocument(els);
}
示例,依旧解析课程URL
public class JsoupXpathDemo {
public static void main(String[] args) {
//基于URL创建
JXDocument jxd = JXDocument.createByUrl("https://www.runoob.com");
//Xpath语句
String xpathStr = "//div[1]/a";
//获取节点集合
List<JXNode> list = jxd.selN(xpathStr);
//遍历节点
for (JXNode node : list) {
String title = node.sel("./h4").get(0).asElement().text();
String describe = node.sel("./strong").get(0).asElement().text();
String url = node.asElement().attr("href");
System.out.println("标题为:" + title);
System.out.println("描述为:" + describe);
System.out.println("URL为:" + url);
System.out.println();
}
}
}
标题为:【学习 HTML】
描述为:HTML,即超文本标记语言(Hyper Text Markup Language)
URL为://www.runoob.com/html/html-tutorial.html
标题为:【学习 HTML5】
描述为:HTML5 是下一代 HTML 标准
URL为://www.runoob.com/html/html5-intro.html
标题为:【学习 CSS】
描述为:层叠样式表(Cascading StyleSheet)
URL为://www.runoob.com/css/css-tutorial.html
标题为:【学习 CSS3】
描述为:CSS3是CSS技术的升级版本
URL为://www.runoob.com/css3/css3-tutorial.html
标题为:【学习 Bootstrap3】
描述为:Bootstrap,来自 Twitter,是目前最受欢迎的前端框架
URL为://www.runoob.com/bootstrap/bootstrap-tutorial.html
标题为:【学习 Bootstrap4】
描述为:Bootstrap4 前端框架
URL为://www.runoob.com/bootstrap4/bootstrap4-tutorial.html
标题为:【学习 Bootstrap5】
描述为:Bootstrap5 目前是 Bootstrap 的最新版本
URL为://www.runoob.com/bootstrap5/bootstrap5-tutorial.html
标题为:【学习 Font Awesome】
描述为:Font Awesome 是一套绝佳的图标字体库和CSS框架。
URL为://www.runoob.com/font-awesome/fontawesome-tutorial.html
标题为:【学习 Foundation】
描述为:Foundation 用于开发响应式的 HTML, CSS and JavaScript 框架
URL为://www.runoob.com/foundation/foundation-tutorial.html