SourceFrom:https://github.com/jhy/jsoup
SourceFrom:http://www.open-open.com/jsoup/parsing-a-document.htm
在你解析一个Document之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。
可以使用属性设置方法 Element.attr(String key, String value)
, 和 Elements.attr(String key, String value)
.
假如你需要修改一个元素的 class
属性,可以使用 Element.addClass(String className)
和 Element.removeClass(String className)
方法。
Elements
提供了批量操作元素属性和class的方法,比如:要为div中的每一个a元素都添加一个 rel="nofollow"
可以使用如下方法:
doc.select("div.comments a").attr("rel", "nofollow");
与Element
中的其它方法一样,attr
方法也是返回当 Element
(或在使用选择器是返回 Elements
集合)。这样能够很方便使用方法连用的书写方式。比如:
doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");
你需要一个元素中的HTML内容
可以使用Element
中的HTML设置方法具体如下:
Element div = doc.select("div").first(); // <div></div>
div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div>
div.prepend("<p>First</p>");//在div前添加html内容
div.append("<p>Last</p>");//在div之后添加html内容
// 添完后的结果: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div>
Element span = doc.select("span").first(); // <span>One</span>
span.wrap("<li><a href='http://example.com/'></a></li>");
// 添完后的结果: <li><a href="http://example.com"><span>One</span></a></li>
Element.html(String html)
这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。Element.prepend(String first)
和 Element.append(String last)
方法用于在分别在元素内部HTML的前面和后面添加HTML内容Element.wrap(String around)
对元素包裹一个外部HTML内容。Element.prependElement(String tag)
和
Element.appendElement(String tag)
方法来创建新的元素并作为文档的子元素插入其中。
你需要修改一个HTML文档中的文本内容
可以使用Element
的设置方法::
Element div = doc.select("div").first(); // <div></div>
div.text("five > four"); // <div>five > four</div>
div.prepend("First ");
div.append(" Last");
// now: <div>First five > four Last</div>
文本设置方法与 HTML setter 方法一样:
Element.text(String text)
将清除一个元素中的内部HTML内容,然后提供的文本进行代替Element.prepend(String first)
和 Element.append(String last)
将分别在元素的内部html前后添加文本节点。<
,
>
等这样的字符,将以文本处理,而非HTML。
在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。
使用jsoup HTML Cleaner
方法进行清除,但需要指定一个可配置的 Whitelist
。
String unsafe =
"<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。所以我们经常只让用户输入纯文本的内容,但这样用户体验就比较差了。
一个更好的解决方法就是使用一个富文本编辑器WYSIWYG如CKEditor 和 TinyMCE。这些可以输出HTML并能够让用户可视化编辑。虽然他们可以在客户端进行校验,但是这样还不够安全,需要在服务器端进行校验并清除有害的HTML代码,这样才能确保输入到你网站的HTML是安全的。否则,攻击者能够绕过客户端的Javascript验证,并注入不安全的HMTL直接进入您的网站。
jsoup的whitelist清理器能够在服务器端对用户输入的HTML进行过滤,只输出一些安全的标签和属性。
jsoup提供了一系列的Whitelist
基本配置,能够满足大多数要求;但如有必要,也可以进行修改,不过要小心。
这个cleaner非常好用不仅可以避免XSS攻击,还可以限制用户可以输入的标签范围。
Cleaner
,了解如何返回一个 Document
对象,而不是字符串Whitelist
,了解如何创建一个自定义的whitelist