在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。
org.jsoup.safety.Whitelist
是个清理器, 定义了什么html元素或者属性可以通过, 而其他的所有内容都将被删除。
模板
模板 | 允许标签或属性 | 简要说明 |
---|---|---|
none() | 无 | 纯文本 |
simpleText() | b, em, i, strong, u | 简单文本, 不包括属性 |
basic() | a[href(ftp, http, https, mailto), rel[nofollow]], b, blockquote[cite(http, https)], br, cite[cite(http, https)], code, dd, dl, dt, em, i, li, ol, p, pre, q[cite], small, strike, strong, sub, sup, u, ul |
基础白名单, 更加完整的文本节点和合适的属性 |
basicWithImages() | 同上, img[align, alt, height, src(http, https), title, width] | 带照片的基础白名单, 除了和basic()有相同的标签外 还增加了img标签 |
relaxed() | a[href(ftp, http, https, mailto), title], b, blockquote[cite(http, https)], br, caption, cite[cite(http, https)], code, col[span, width], colgroup[span, width], dd, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img[align, alt, height, src((http, https)), title, width], li, ol[start, type], p, pre, q[cite((http, https))], small, strike, strong, sub, sup, table[summary, width], tbody, td[abbr, axis, colspan, rowspan, width], tfoot, th[abbr, axis, colspan, rowspan, scope, width], thead, tr, u, ul[type] |
较为宽松的白名单 |
如果你想拓展这些模板, 可以通过以下方法, 但是需要格外小心
addTags(java.lang.String...): 添加标签
addAttributes(java.lang.String, java.lang.String...): 往指定标签中添加属性
addEnforcedAttribute(java.lang.String, java.lang.String, java.lang.String): 往制定标签指定属性添加值
addProtocols(java.lang.String, java.lang.String, java.lang.String...): 往制定标签制定属性添加协议
当然你也可以从这些模板中过滤掉特定的标签或者属性
removeTags(java.lang.String...)
removeAttributes(java.lang.String, java.lang.String...)
removeEnforcedAttribute(java.lang.String, java.lang.String)
removeProtocols(java.lang.String, java.lang.String, java.lang.String...)
实践
故宫景点简介去除div标签及所有标签属性
@Test
public void func1() throws IOException {
String url = "http://you.ctrip.com/sight/beijing1/229.html";
Connection con = Jsoup.connect(url).timeout(30000);
// 设置用户代理
con.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36");
Document doc = con.get();
// 景点简介部分
Element select = doc.selectFirst(".s_sight_infor");
String clean = Jsoup.clean(select.html(), getImagesWhitelist());
System.out.println(clean);
Element imgTag = doc.selectFirst("div.s_sight_map img");
String src = imgTag.attr("src");
System.err.println("照片的链接: " + src);
}
public Whitelist getImagesWhitelist() {
Whitelist images = Whitelist.none();
images.addTags("ul", "img", "li", "dl", "dd", "dt");
images.addAttributes("img", "src");
return images;
}
爬取数据并清理后的效果
网友评论