关于Jsoup将相对路径转为绝对路径的方法
作者:CrazyDragon_King 发布时间:2022-03-11 04:13:50
自从使用 HttpClient 和 Jsoup 配合编写了几个简单的入门爬虫之后,发现对于绝对路径的需求是很频繁的,因为大部分的网页都写相对路径,这样是有好处的,但是爬虫还是需要获取绝对的路径的。 通常我的处理方式是在获取的相对路径路径前面,拼接一个根路径。当是,这种方法只能适用于,相对路径是相对于当前路径的,如果相对路径是相对于当前路径的上一级或更上一级,那就不好处理了。
正好我昨天我碰到了这种相对路径。我无意间发现原来 Jsoup 本身就提供了这个功能,但是我发现很多其他人的博客,虽然介绍了 Jsoup 通过相对路径获取绝对路径的方法,但是都没有介绍完全,为此我也是走了几个坑,特意在此说明一下。
通过Jsoup将相对路径转为绝对路径的方法
如果想要通过 attr 方法获取到绝对路径,必须同时使用这两个方法。
Document org.jsoup.Jsoup.parse(String html, String baseUri);
String org.jsoup.nodes.Node.attr(String attributeKey);
必须使用Jsoup 带有 baseUri 参数的重载方法,如果只是用具有第一个参数的 方法,那么通过attr取绝对路径时,获取的内容为空!这是一个坑,但是其它人的博客都没有介绍这一点。
Parameters:
html HTML to parse
baseUri The URL where the HTML was
retrieved from. Used to resolve relative URLs to absolute URLs, that
occurbefore the HTML declares a <base href> tag.
这里列出参数的注释,第一个参数是需要解析的html文档,第二个参数是这个html的url。用于将相对url解析为绝对url,即在HTML声明标记之前发生。
注意: 这里的 baseUri 并不是网站的根路径,它是指当前的html路径。即当前相对路径所在的html文档的路径,是相对路径相对的那个路径。 所以,如果填写的是当前根路径,那么最后获取的绝对路径也是有问题的。(也许是可以使用的,但是格式可能有问题。) 下面第二点,依赖于当前这个给定的 baseUri 参数。
attr 方法里面的一句话:
To get an absolute URL from an attribute that may be a relative URL, prefix the key with abs,which is a shortcut to the absUrl method.
E.g.: String url = a.attr(“abs:href”);
这句话的意思是从一个相对路径种获取一个绝对路径,使用 abs 前缀,这是absUrl方法的快捷方式。
并且给了一个示例:
String url = a.attr("abs:href");
所以,如果想要获取到绝对路径的话,需要在参数前面加上 abs:
。 这里 abs 就是 absolute 的缩写,它的意思就是绝对的。
但是,如果不去使用带有上面第一点提到的那个重载的 parse 方法的话,这种方法是取不到绝对路径的,甚至是取不到路径。我在这里踩了一个坑。
示例
这里以一个简单的例子说明: 代码:
package ahnu.news;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class JsoupPathTest {
public static void main(String[] args) {
String html = "<html>"
+ "<head></head>"
+ "<body>"
+ "<a href=\"../dragon/love/you\"></a>"
+ "</body>"
+ "</html>";
System.out.println("正确的用法");
Document doc = Jsoup.parse(html, "http://example/index/loveyou/");
Element aTag = doc.getElementsByTag("a").first(); //获取 a 标签,只有一个,取第一个即可。
System.out.println(aTag);
String relativePath = aTag.attr("href"); //获取相对路径
String absolutePath = aTag.attr("abs:href"); //获取绝对路径
System.out.println("相对路径:" + relativePath);
System.out.println("绝对路径:" + absolutePath);
System.out.println("---------------------分割线---------------------");
System.out.println("错误的用法");
doc = Jsoup.parse(html);
aTag = doc.getElementsByTag("a").first(); //获取 a 标签,只有一个,取第一个即可。
System.out.println(aTag);
relativePath = aTag.attr("href"); //获取相对路径
absolutePath = aTag.attr("abs:href"); //获取绝对路径
System.out.println("相对路径:" + relativePath);
System.out.println("绝对路径:" + absolutePath);
}
}
运行结果:
注意: 1.在解析html的时候,必须添加 baseUri 参数,否则获取绝对路径时,反而什么都得不到,这是一个坑,注意防范。 2.希望其他人贴方法的时候,可以附带代码的执行结果,或者如果是转载的别人的博客,也可以运行一下代码,不然如果他错了,你也转载,那就是在传播错误了。 3.英语还是很重要的,关键时候可以帮助自己理解api的正确用法。
来源:https://blog.csdn.net/qq_40734247/article/details/106294290


猜你喜欢
- 网上android播放器虽然挺多,感觉提供的歌词显示功能比较死板,要么搜索给的条件死死的,要么放置sdcard内部的歌词格式需要统一,应该提
- 上一章说明了DataBinding生存的类之间关系,现在这里来看看布局是如何加载的以及view是如何映射的。一、布局加载这里把之前的代码重新
- 消息队列1.消息队列的原理1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护,1.2 系统中可能有很多的msgqueu
- 介绍该系统有三个角色,分别是:普通用户、房屋中介、管理员。普通用户的功能:浏览房屋信息、预约看房、和中介聊天、申请成为中介等等。房屋中介的功
- Java中,for-each循环简化了任何Collection或array的遍历过程,但并不是每个Java程序员都了解本文将要描述的for-
- 本文实例为大家分享了java实现滑动验证解锁的具体代码,供大家参考,具体内容如下1.html:<div class="dra
- 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保
- 1.组件添加1.1@Configuration@Configuration:告诉SpringBoot这是一个配置类配置类里面使用@Bean标
- android欢迎页自动跳转及手机网络检测,具体实现代码如下所示:在1.2s后从欢迎页(welcome)跳转到登陆页(Login_Activ
- 本课程的目标是帮你更有效的使用Java。其中讨论了一些高级主题,包括对象的创建、并发、序列化、反射以及其他高级特性。本课程将为你的精通Jav
- 简介在之前spring boot3文章中我们介绍了,spring boot3的一个重要特性就是支持把spring boot3的应用编译成为G
- 本文实例讲述了Java面向对象程序设计:类的定义,静态变量,成员变量,构造函数,封装与私有,this概念与用法。分享给大家供大家参考,具体如
- 本文实例讲述了Android编程之控件ListView使用方法。分享给大家供大家参考。具体分析如下:控件ListView是一个重要的控件,可
- 去除XSS字符串需要借助工具类 jsoup ,这里jsoup有一点需要注意的是,jsoup的功能可能有点太强大了,能把xss攻击的内容直接过
- 一、ehcahe的介绍EhCache 是一个纯Java的进程内缓存框架,具有高速、精干等特点,是Hibernate中默认的CacheProv
- 前言:想象一下,有一个服务提供个多个客户端调用,但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息,而订单服务调用商品
- 需求:学生输入姓名和语文、数学、英语,编程求出总分和平均分,并在屏幕上显示XX的总分和平均分using System;using Syste
- 先附上图片上传的代码jsp代码如下:<form action="${path}/upload/uploadPic.do&qu
- 当我们在windows系统下安装完jdk时,测试案例HelloWorld;运行java命令时报错:找不到或无法加载主类解决方法:1.首先检查
- 1.基本介绍Java自带日期格式化工具DateFormat ,但是DateFormat 的所有实现,包括 SimpleDateFormat