文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于Jsoup将相对路径转为绝对路径的方法

2023-05-17 17:56

关注

自从使用 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的正确用法。

到此这篇关于关于Jsoup将相对路径转为绝对路径的方法的文章就介绍到这了,更多相关Jsoup获取绝对路径内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯