使用 Jsoup 从 HTML 获取标题
调用 document.title() 方法获取 HTML 页面的标题。
try { Document document = Jsoup.parse( new File("C:/Users/xyz/Desktop/onitroad.html"), "utf-8"); System.out.println(document.title()); } catch (IOException e) { e.printStackTrace(); }
使用 Jsoup 清理不受信任的 HTML(以防止 XSS)
假设,在应用程序中,我们希望显示用户提交的 HTML 片段。
例如,用户可以在注释框中放置 HTML 内容。
这可能会导致非常严重的问题,如果我们允许先清理后直接显示此 HTML。
用户可以其中放入一些恶意脚本并将用户重定向到另一个肮脏的网站。
为了清理这个 HTML,Jsoup 提供了 Jsoup.clean() 方法。
此方法需要字符串形式的 HTML 内容,它将返回干净的 HTML。
为了执行此任务,Jsoup 使用白名单消毒剂。
jsoup 白名单清理器的工作方式是解析输入 HTML(在安全的沙盒环境中),然后遍历解析树,只允许已知安全的标签和属性(和值)进入清理后的输出。
它不使用不适合此任务的正则表达式。
清洁器不仅可以用于避免 XSS,还可以限制用户可以提供的元素范围:我们可以使用文本 a、strong 元素,但不适用于结构 div 或者 table 元素。
String dirtyHTML = "<p><a href='//onitroad.com/' onclick='sendCookiesToMe()'>Link</a></p>"; String cleanHTML = Jsoup.clean(dirtyHTML, Whitelist.basic()); System.out.println(cleanHTML); Output: <p><a href="//onitroad.com/" rel="nofollow">Link</a></p>
使用 Jsoup 获取 HTML 页面的收藏图标
假设网站图标图像将是 HTML 文档 <head>
部分中的第一个图像,我们可以使用以下代码。
String favImage = "Not Found"; try { Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/onitroad.html"), "utf-8"); Element element = document.head().select("link[href~=.*\.(ico|png)]").first(); if (element == null) { element = document.head().select("meta[itemprop=image]").first(); if (element != null) { favImage = element.attr("content"); } } else { favImage = element.attr("href"); } } catch (IOException e) { e.printStackTrace(); } System.out.println(favImage);
Java 使用 Jsoup API 处理 HTML 文档实例
Jsoup的功能
jsoup 实现了 WHATWG HTML5 规范,并将 HTML 解析为与现代浏览器相同的 DOM。
- 从 URL、文件或者字符串中抓取和解析 HTML
- 使用 DOM 遍历或者 CSS 选择器查找和提取数据
- 操作 HTML 元素、属性和文本
- 根据安全白名单清理用户提交的内容,以防止 XSS 攻击
- 输出整洁的 HTML
使用 Jsoup API 加载文档
从 URL 加载文档
使用 Jsoup.connect() 方法从 URL 加载 HTML。
try { Document document = Jsoup.connect("//onitroad.com").get(); System.out.println(document.title()); } catch (IOException e) { e.printStackTrace(); }
从文件加载文档
使用 Jsoup.parse() 方法从文件加载 HTML。
try { Document document = Jsoup.parse( new File( "c:/temp/demo.html" ) , "utf-8" ); System.out.println(document.title()); } catch (IOException e) { e.printStackTrace(); }
从字符串加载文档
使用 Jsoup.parse() 方法从字符串加载 HTML。
try { 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()); } catch (IOException e) { e.printStackTrace(); }
使用 Jsoup 获取html页面中的表单属性
在网页中获取表单输入元素非常简单。
使用唯一 ID 查找 FORM 元素;然后找到该表单中存在的所有 INPUT 元素。
Document doc = Jsoup.parse(new File("c:/temp/onitroad.com"),"utf-8"); Element formElement = doc.getElementById("loginForm"); Elements inputElements = formElement.getElementsByTag("input"); for (Element inputElement : inputElements) { String key = inputElement.attr("name"); String value = inputElement.attr("value"); System.out.println("Param name: "+key+" \nParam value: "+value); }
使用 Jsoup 获取 HTML 页面中的所有链接
要获取网页中的所有链接,请使用以下代码。
try { Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/onitroad.html"), "utf-8"); Elements links = document.select("a[href]"); for (Element link : links) { System.out.println("link : " + link.attr("href")); System.out.println("text : " + link.text()); } } catch (IOException e) { e.printStackTrace(); }
使用 Jsoup 获取 HTML 页面中的所有图像
要获取网页中显示的所有图像,请使用以下代码。
try { Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/onitroad.html"), "utf-8"); Elements images = document.select("img[src~=(?i)\.(png|jpe?g|gif)]"); for (Element image : images) { System.out.println("src : " + image.attr("src")); System.out.println("height : " + image.attr("height")); System.out.println("width : " + image.attr("width")); System.out.println("alt : " + image.attr("alt")); } } catch (IOException e) { e.printStackTrace(); }
运行时依赖
我们可以使用以下 maven 依赖项将 Jsoup jar 包含到项目中。
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.2</version> </dependency>
或者你也可以直接从jsoup.org 网站下载jsoup-1.8.2.jar 并将其添加到项目的lib 文件夹中。
使用 Jsoup 更新元素的属性/内容
就在我们使用上述方法找到所需元素时;我们可以使用 Jsoup API 来更新这些元素的属性或者 innerHTML。
例如,我想更新文档中存在“rel=nofollow”的所有链接。
try { Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/onitroad.html"), "utf-8"); Elements links = document.select("a[href]"); links.attr("rel", "nofollow"); } catch (IOException e) { e.printStackTrace(); }
使用 Jsoup 获取 URL 的元信息
元信息包括搜索引擎(如 Google)用于确定网页内容以用于索引目的的内容。
它们以一些标签的形式出现在 HTML 页面的 HEAD 部分。
要获取有关网页的元信息,请使用以下代码。
try { Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/onitroad.html"), "utf-8"); String description = document.select("meta[name=description]").get(0).attr("content"); System.out.println("Meta description : " + description); String keywords = document.select("meta[name=keywords]").first().attr("content"); System.out.println("Meta keyword : " + keywords); } catch (IOException e) { e.printStackTrace(); }
Jsoup 常用的类
虽然完整的库中有很多类,但大多数情况下我们将处理下面给出的 3 个类。
- org.jsoup.Jsoup
Jsoup 类将成为任何程序的入口点,并提供从各种来源加载和解析 HTML 文档的方法。
Jsoup 类的一些重要方法如下:
方法 | 描述 |
---|---|
static Connection connect(String url) | 创建并返回 URL 的连接。 |
static Document parse(File in, String charsetName) | 将指定的字符集文件解析为文档。 |
static Document parse(String html) | 将给定的 html 代码解析为文档。 |
static String clean(String bodyHtml, Whitelist whitelist) | 通过解析输入 HTML 并通过允许的标记和属性的白名单对其进行过滤,从输入 HTML 返回安全的 HTML。 |
- org.jsoup.nodes.Document
此类表示通过 Jsoup 库加载的 HTML 文档。我们可以使用此类执行适用于整个 HTML 文档的操作。
Element 类的重要方法可以查看 https://jsoup.org/apidocs/org/jsoup/nodes/Document.html。
- org.jsoup.nodes.Element
正如我们所知,HTML 元素由标记名称、属性和子节点组成。使用 Element 类,我们可以提取数据、遍历节点图和操作 HTML。
Element 类的重要方法可以查看 https://jsoup.org/apidocs/org/jsoup/nodes/Element.html。