JSoup快速入门

Jsoup是用于解析HTML,就类似XML解析器用于解析XML.Jsoup它解析HTML成为真实世界的HTML。它与jquery选择器的语法非常相似,并且非常灵活容易使用以获得所需的结果。在本教程中,我们将介绍很多Jsoup的例子。

能用Jsoup实现什么?

  • 从URL,文件或字符串中刮取并解析HTML
  • 查找和提取数据,使用DOM遍历或CSS选择器
  • 操纵HTML元素,属性和文本
  • 根据安全的白名单清理用户提交的内容,以防止XSS攻击
  • 输出整洁的HTML

安装 – 运行时依赖关系

您可以使用下面的maven依赖项将Jsoup jar包含到项目中。

 <dependency>  <groupId>org.jsoupgroupId> <artifactId>jsoupartifactId> <version>1.10.2version> dependency> 

XML

JSoup应用的主要类

虽然完整的类库中有很多类,但大多数情况下,给出下面3个类的英文我们需要重点了解的。

1. org.jsoup.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并通过允许的标签和属性的白名单进行过滤。

2. org.jsoup.nodes.Document类

该类表示通过Jsoup库加载HTML文档。可以使用此类执行适用于整个HTML文档的操作。

Element类的重要方法可以参见 – http://jsoup.org/apidocs/org/jsoup/nodes/Document.html

3. org.jsoup.nodes.Element类

HTML元素是由标签名称,属性和子节点组成。使用元类,您可以提取数据,遍历节点和操作HTML。

Element类的重要方法可参见 – http://jsoup.org/apidocs/org/jsoup/nodes/Element.html

应用实例

现在我们来看一些使用Jsoup API处理HTML文档的例子。

1.载入文件

从URL加载文档,使用Jsoup.connect()方法从URL加载HTML。

 try {     Document document = Jsoup.connect("http://www.yiibai.com").get();     System.out.println(document.title()); } catch (IOException e) {     e.printStackTrace(); } 

Java的

2.从文件加载文档

使用Jsoup.parse()方法从文件加载HTML。

 try {     Document document = Jsoup.parse( new File( "D:/temp/index.html" ) , "utf-8" );     System.out.println(document.title()); } catch (IOException e) {     e.printStackTrace(); } 

Java的

3.从String加载文档

使用Jsoup.parse()方法从字符串加载HTML。

 try {     String html = "First parse" + "

Parsed HTML into a doc.

"
; Document document = Jsoup.parse(html); System.out.println(document.title()); } catch (IOException e) { e.printStackTrace(); }

Java的

4.从HTML获取标题

如上图所示,调用document.title()方法HTML电子杂志页面的标题。

 try {     Document document = Jsoup.parse( new File("C:/Users/xyz/Desktop/yiibai-index.html"), "utf-8");     System.out.println(document.title()); } catch (IOException e) {     e.printStackTrace(); } 

Java的

5.获取HTML页面的Fav图标

假设favicon图像将HTML的英文的文档部分中的第一个图像,您可以使用下面的代码。

 String favImage = "Not Found"; try {     Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.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的

6.获取HTML页面中的所有链接

要获取网页中的所有链接,请使用以下代码。

 try {     Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.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(); } 

Java的

7.获取HTML页面中的所有图像

要获取网页中显示的所有图像,请使用以下代码。

 try {     Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.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(); } 

Java的

8.获取URL的元信息

元信息包括Google等搜索引擎用来确定网页内容的索引为目的。它们以HTML页面的HEAD部分中的一些标签的形式存在。要获取有关网页的元信息,请使用下面的代码。

 try {     Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai-index.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(); } 

Java的

9.在HTML页面中获取表单属性

在网页中获取表单输入元素非常简单。使用唯一ID查找FORM元素; 然后找到该表单中存在的所有输入元素。

 Document doc = Jsoup.parse(new File("c:/temp/yiibai-index.html"),"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); } 

Java的

10.更新元素的属性/内容

只要您使用上述方法找到您想要的元素; 可以使用Jsoup API来更新这些元素的属性或innerHTML。例如,想更新文档中存在的“ rel = nofollow”的所有链接。

 try {     Document document = Jsoup.parse(new File("C:/Users/zkpkhua/Desktop/yiibai.com.html"), "utf-8");     Elements links = document.select("a[href]");       links.attr("rel", "nofollow"); } catch (IOException e) {     e.printStackTrace(); } 

Java的

10.消除不信任的HTML(以防止XSS)

假设在应用程序中,想显示用户提交的HTML片段。例如用户可以在评论框中放入HTML内容。这可能会导致非常严重的问题,如果您允许直接显示此HTML。用户可以在其中放入一些恶意脚本,并将用户重定向到另一个脏网站。

为了清理这个HTML,Jsoup提供Jsoup.clean()方法。此方法期望HTML格式的字符串,并将返回清洁的HTML。要执行此任务,Jsoup使用白名单过滤器.jsoup白名单过滤器通过解析输入HTML(在安全的沙盒环境中)工作,然后遍历解析树,只允许将已知安全的标签和属性(和值)通过清理后输出。

它不使用正则表达式,这对于此任务是不合适的。

清洁器不仅用于避免XSS,还限制了用户可以提供的元素的范围:您可以使用文本,强元素,不能但构造div或表元素。

 String dirtyHTML = "

Link

"
; String cleanHTML = Jsoup.clean(dirtyHTML, Whitelist.basic()); System.out.println(cleanHTML);

Java的

执行后输出结果如下 –

 <p><a href="http://www.yiibai.com/" rel="nofollow">Link</a></p>

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/264064.html

(0)
上一篇 2022年6月6日
下一篇 2022年6月6日

相关推荐

发表回复

登录后才能评论