Groovy—操作 HTML 文档

本文介绍了在Groovy中处理HTML文档的两种方法:使用Jsoup和TagSoup库。通过Jsoup的DOM方法和CSS选择器进行文档解析、元素选取和操作。同时提醒注意HTML的结构松散特性,以及Jsoup在输出时会添加<html>标签的问题。

原文地址:Groovy—操作 HTML 文档(永久地址,保存网址不迷路 🙃)

 

问题描述

Jenkins Pipeline 中,我们需要对 HTML 文档进行多种操作。之前使用 XMLParser 及 XMLSlurper 库操作 HTML 文档时遇到很多问题,因为 HTML 文档结构松散(比如没有结束标签等等),不是标准的 XML 文件,因此导致 XML 解析失败。

该笔记将整理:在 Groovy 中,操作 HTML 文档的常用方法

解决方案

方案一、使用 Jsoup 类库

项目主页:jsoup Java HTML Parser, with the best of HTML5 DOM methods and CSS selectors.
获取文档的 DOM 对象:Parsing and traversing a Document: jsoup Java HTML parser
使用选择器选择元素:Use selector-syntax to find elements: jsoup Java HTML parser
元素的查找、获取、操作:Use DOM methods to navigate a document: jsoup Java HTML parser

方案二、使用 TagSoup 类库

我们未验证该方法,只是阅读 Grape 手册时发现该方法,这里仅简单记录:

// find the PDF links of the Java specifications
@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2.1')
def getHtml() {
    def parser = new XmlParser(new org.ccil.cowan.tagsoup.Parser())
    parser.parse("https://docs.oracle.com/javase/specs/")
}
html.body.'**'.a.@href.grep(~/.*\.pdf/).each{ println it }

方案一、使用 Jsoup 类库

简单的入门示例

@Grab(group='org.jsoup', module='jsoup', version='1.10.1')
import org.jsoup.Jsoup
import org.jsoup.nodes.* // Element
import org.jsoup.select.* // Elements

def htmlString = "<html><head><title>Title of Page</title></></head></html>"
def htmlDocument = Jsoup.parse(htmlString)

// 找到 title 元素,并获取其内容,然后修改内容
def titleElements = htmlDocument.getElementsByTag("title")
def title = titleElements.first().text()
def titleElement = titleElements.first().text("New Content")

// 找到 heading 元素
Elements hTags = htmlDocument.select("h1, h2, h3, h4, h5, h6");

// 找到 a 标签,并对属性进行操作
Element link = doc.select("a").first()

link.attr("href")       // 获取 href 属性
link.attr("href", "")   // 修改 href 属性
link.removeAttr("href") // 删除 href 属性

String linkOuterH = link.outerHtml() // 获取标签的代码
String linkInnerH = link.html() // 获取标签内部的元素

注意事项

如果可能,尽量不要使用任何 XML 类库操作 HTML 文本(因为 HTML 结构松散,允许出现未闭合标签)。

Jsoup 使用 HTML-parser,所以在输出的 HTML 中,总会被添加 <html>...</html> 外围标签,所以要进行处理:

@Grab(group='org.jsoup', module='jsoup', version='1.10.1')
import org.jsoup.Jsoup
import org.jsoup.nodes.* // Element
import org.jsoup.select.* // Elements

String html = "<p>some text...</p>";
Document docHtml = Jsoup.parse(html);

// 被添加 <html>..</html> 外围标签
println docHtml // <html><head></head><body><p>some text...</p></body></html>

// 需要进行提取,以取出自动添加的标签
println docHtml.body().html() // <p>some text...</p>

// 该问题还有其他解决方法:使用 XML-parser 解析,但是也有限制(比如,未闭合的标签将导致失败)
Document doc = Jsoup.parse(html, "", Parser.xmlParser());

相关文章

「Groovy」- 常用文件操作
「Apache Groovy」- 连接 SQLite 数据库
「Groovy」- 处理日期时间
「Groovy」- 连接数据库(使用 MySQL 演示)
「Apache Groovy」- 运行 Shell 命令
「Groovy」- 处理 Object 与 JSON String 之间的转换

参考文献

Html Slurping in Groovy
Use DOM methods to navigate a document
java - Jsoup: get all heading tags - Stack Overflow
Use selector-syntax to find elements: jsoup Java HTML parser
html - Get innerHTML via Jsoup - Stack Overflow
java - How to avoid surrounding html head tags in Jsoup parse - Stack Overflow
Element (jsoup Java HTML Parser 1.14.1-SNAPSHOT API)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值