java xpath解析html_Java中解析HTML框架之Jsoup

Java中解析HTML框架之Jsoup

场景是这样的,本来是想申请一个第三方支付接口判断用户支付是否成功,后来发现不需要申请接口也可以通过订单号查询页面获取支付结果,这样就可以直接解析html来判断支付结果了,这就引入了本文的主题,Jsoup解析html

当然jsoup不只有上面的应用场景,它还有一个应用场景,就是爬虫!

题外话:上面场景中,使用支付接口其实才是最稳当的办法,但是支付接口申请周期长,而且一些情况下并不是免费的,再者一些支付接口只支持一种语言,可能和本项目不是一个语言(比如项目是Java的,但是人家提供的支付接口只支持PHP),这样增加了系统复杂度,如果业务量大且要求准确的场景下应当使用支付接口,否则可以取巧解析html,解析html有一个不好的地方就是如果html结构变化了,那么接口就得重写,都有优缺点,看场景选择。

Jsoup简介与使用

jsoup 提供了简便的API,使用了HTML5 DOM方法和CSS选择器用来解析HTML。其实现了WHATWG HTML5 规范,像浏览器一样解析HTML。

从文件,URL,字符串抓取和解析HTML

使用DOM遍历或者CSS选择器来查找和提取数据

操作HTML元素,属性和文字

清除用户提交的安全白名单以外的内容,以防止XSS攻击

美化HTML

引入依赖

org.jsoup

jsoup

1.11.2

解析HTML

从字符串解析

String html = "

First parse"

+ "

Parsed HTML into a doc.

";

Document doc = Jsoup.parse(html);

从URL解析

// 简洁版

Document doc = Jsoup.connect("http://example.com/").get();

String title = doc.title();

//完整版

doc = Jsoup.connect("http://example.com")

.data("query", "Java")

.userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")

.cookie("auth", "token")

.timeout(3000)

.post();

从文件解析

File input = new File("/tmp/input.html");

Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

提取HTML

遍历HTML

File input = new File("/tmp/input.html");

Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Element content = doc.getElementById("content");

Elements links = content.getElementsByTag("a");

for (Element link : links) {

String linkHref = link.attr("href");

String linkText = link.text();

}

提取数据

String html = "

An example link.

";

Document doc = Jsoup.parse(html);

Element link = doc.select("a").first();

String text = doc.body().text(); // "An example link"

String linkHref = link.attr("href"); // "http://example.com/"

String linkText = link.text(); // "example""

String linkOuterH = link.outerHtml();

// "example"

String linkInnerH = link.html(); // "example"

相对路径转换成绝对路径,一些a标签使用的是相对路径,下面的代码可以将其转换成绝对路径

Document doc = Jsoup.connect("http://jsoup.org").get();

Element link = doc.select("a").first();

String relHref = link.attr("href"); // == "/"

String absHref = link.attr("abs:href"); // "http://jsoup.org/"

CSS选择器

Jsoup支持CSS选择器,用的是 Element.select(String selector)方法

File input = new File("/tmp/input.html");

Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Elements links = doc.select("a[href]"); // a with href

Elements pngs = doc.select("img[src$=.png]");

// img with src ending .png

Element masthead = doc.select("div.masthead").first();

// div with class=masthead

Elements resultLinks = doc.select("h3.r > a"); // direct a after h3

如何快速定位页面上元素的内容?答案是打开Chrome,按F12打开开发者工具,定位到想要的DOM节点,右键,copy,选择Copy selector,即可生成CSS选择器,类似于body > div > div.content > div.col2 > div > h3:nth-child(10)

[图片上传失败...(image-9e253d-1612268032988)]

遗憾的是Jsoup不支持Xpath选择器,但是早就有人意识到这个问题了,所以诞生了JsoupXpath

JsoupXpath 是一款纯Java开发的使用xpath解析提取html数据的解析器,针对html解析完全重新实现了W3C XPATH 1.0标准语法,xpath的Lexer和Parser基于Antlr4构建,html的DOM树生成采用Jsoup,故命名为JsoupXpath.

为了在java里也享受xpath的强大与方便但又苦于找不到一款足够好用的xpath解析器,故开发了JsoupXpath。JsoupXpath的实现逻辑清晰,扩展方便,

支持完备的W3C XPATH 1.0标准语法,W3C规范:http://www.w3.org/TR/1999/REC-xpath-19991116 ,JsoupXpath语法描述文件Xpath.g4

操作HTML

jsoup可以在插入、删除、提取HTML,直接看例子代码

设置属性

//设置属性

doc.select("div.comments a").attr("rel", "nofollow");

doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");

插入html

//插入html

Element div = doc.select("div").first(); //

div.html("

lorem ipsum

"); //

lorem ipsum

div.prepend("

First

");

div.append("

Last

");

// now:

First

lorem ipsum

Last

Element span = doc.select("span").first(); // One

span.wrap("

");

// now:

One

设置文本

//设置文本

Element div = doc.select("div").first(); //

div.text("five > four"); //

five > four

div.prepend("First ");

div.append(" Last");

// now:

First five > four Last

String unsafe =

"

Link

";

String safe = Jsoup.clean(unsafe, Whitelist.basic());

// now:

Link

参考


版权声明:本文为weixin_39607423原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。