Jsoup HTML解析器示例

Jsoup代表 HTML, XML解析器代表 XML。它解析HTML;真实世界的HTML。其类似于选择器语法的 jquery非常易于使用,并且非常灵活,可以得到所需的结果。在本教程中,我们将介绍许多Jsoup的示例。

目录

使用Jsoup可以实现什么?
运行时相关性
您应该知道的主要类
加载文档
从HTML获取标题
获取HTML页面的Fav图标获取HTML页面的
所有链接
获取
HTML页面的所有图像获取URL的元信息
获取HTML页面的表单属性
更新元素的属性/内容
清理不可信的HTML(以防止XSS)

使用Jsoup可以实现什么?

jsoup实现WHATWG HTML5规范,并将HTML解析为与现代浏览器相同的DOM。

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

运行时依赖

您可以使用以下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文件夹中。

你应该知道的主要课程

尽管完整的库中有很多类,但是大多数情况下您将要处理以下给定的3个类。让我们看看他们

  1. org.jsoup.Jsoup

    Jsoup类将是任何程序的入口点,并将提供从各种来源加载和解析HTML文档的方法。

    Jsoup类的一些重要方法如下:

    [su_table]

    方法 描述
    静态连接connect(字符串url) 创建并返回URL的连接。
    静态文档解析(文件输入,字符串charsetName) 将指定的字符集文件解析为文档。
    静态文档解析(字符串html) 将给定的html代码解析为文档。
    静态字符串清理(字符串bodyHtml,白名单白名单) 通过解析输入HTML并通过允许的标签和属性的白名单对其进行过滤,从输入HTML返回安全HTML。

    [/ su_table]

  2. org.jsoup.nodes.Document

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

    可以在http://jsoup.org/apidocs/org/jsoup/nodes/Document.html中查看Element类的重要方法。

  3. org.jsoup.nodes.Element

    如您所知,HTML元素由标记名称,属性和子节点组成。使用Element类,您可以提取数据,遍历节点图并处理HTML。

    可以在http://jsoup.org/apidocs/org/jsoup/nodes/Element.html中查看Element类的重要方法。

现在让我们来看一些例子来工作,使用Jsoup API的HTML文档。

载入文件

从URL加载文档

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

try 
{
	Document document = Jsoup.connect("//how2codex.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();
}  

从HTML获取标题

如上所示,调用document.title()方法以获取HTML页面的标题。

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

获取HTML页面的收藏夹图标

假设favicon图像将成为<head>HTML文档部分中的第一张图像,则可以使用以下代码。

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

获取HTML页面中的所有链接

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

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

获取HTML页面中的所有图像

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

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

获取URL的元信息

元信息包含哪些搜索引擎(例如Baidu)用于确定网页内容以进行索引。它们以一些标记的形式出现在HTML页面的HEAD部分中。要获取有关网页的元信息,请使用以下代码。

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

在HTML页面中获取表单属性

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

Document doc = Jsoup.parse(new File("c:/temp/how2codex.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 API更新这些元素的属性或innerHTML。例如,我想更新"rel=nofollow"文档中存在的所有链接。

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

清理不受信任的HTML(以防止XSS)

假设,在您的应用程序中,您想要显示用户提交的HTML代码段。例如,用户可以将HTML内容放在注解框中。如果您允许先清洁直接显示此HTML,则会导致非常严重的问题。用户可以在其中放入一些恶意脚本,然后将您的用户重定向到另一个肮脏的网站。

为了清理此HTML,Jsoup提供了Jsoup.clean()方法。此方法期望HTML内容为String形式,它将返回干净的HTML。为了执行此任务,Jsoup使用白名单清除程序。jsoup白名单清理程序的工作原理是(在安全的沙盒环境中)解析输入的HTML,然后遍历解析树,仅允许将已知安全的标记和属性(和值)传递到清除的输出中。

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

清理程序不仅对避免XSS有用,而且在限制用户可以提供的元素范围方面也非常有用:您可以使用文本a,强元素,但不能使用结构div或表元素。

String dirtyHTML = "<p><a href='//how2codex.com/' onclick='sendCookiesToMe()'>Link</a></p>";

String cleanHTML = Jsoup.clean(dirtyHTML, Whitelist.basic());

System.out.println(cleanHTML);

Output:

<p><a href="//how2codex.com/" rel="nofollow">Link</a></p>

这就是这个非常简单但功能强大且有用的库的全部内容。如果您有任何疑问,请在评论区留言,我会一一解答。

学习愉快!

saigon has written 1440 articles

Leave a Reply