【问题标题】:Jsoup.parse() vs. Jsoup.parse() - or How does URL detection work in Jsoup?Jsoup.parse() 与 Jsoup.parse() - 或者 Jsoup 中的 URL 检测如何工作?
【发布时间】:2011-10-31 19:32:42
【问题描述】:

Jsoup 有 2 个 html parse() 方法:

  1. parse(String html) - “由于没有指定基本 URI,所以绝对 URL 检测依赖于包含标签的 HTML。”
  2. parse(String html, String baseUri) - "HTML 所在的 URL 从中检索。用于将相对 URL 解析为绝对 URL, 发生在 HTML 声明标签之前。”

我很难理解两者之间差异的含义

  1. 在第二个parse() 版本中,“将相对 URL 解析为绝对 URL”是什么意思? 之前 HTML声明了一个<base href>标签”是什么意思?如果一个 <base href>标签从不出现在页面中?
  2. 绝对 URL 检测的目的是什么?为什么需要 Jsoup 找到绝对网址?
  3. 最后也是最重要的:baseUri是HTML页面的完整URL吗 (如原始文档中所述)还是它的 base URL HTML 页面?

【问题讨论】:

    标签: java html-parsing jsoup


    【解决方案1】:

    它用于Element#absUrl() 等,以便您可以检索<a href><img src><link href><script src> 等的(预期)绝对 URL。例如

    for (Element link : document.select("a")) {
        System.out.println(link.absUrl("href"));
    }
    

    如果您还想下载和/或解析链接的资源,这非常有用。


    在第二个 parse() 版本中,“在 HTML 声明 <base href> 标签之前将相对 URL 解析为绝对 URL”是什么意思?如果页面中从未出现过<base href> 标签怎么办?

    一些(较差的)网站可能在<base> 标记之前声明了<link><script> 的相对URL。或者,如果没有 <base> 标签,那么只有给定的 baseUri 将用于解析整个文档的相对 URL。


    绝对 URL 检测的目的是什么?为什么Jsoup需要查找绝对URL?

    为了在Element#absUrl() 上返回正确的 URL。这纯粹是为了最终用户的方便。 Jsoup 不需要它就可以自己成功解析 HTML。


    最后,但最重要的是:baseUri 是 HTML 页面的完整 URL(如原始文档中所述)还是 HTML 页面的基本 URL?

    前者。如果是后者,那么文档就会撒谎。 baseUri 不得与 <base href> 混淆。

    【讨论】:

    • 这是一个非常有用的答案(一如既往)。一些澄清:(1)Jsoup 是否能够派生<base href>?如果是这样,既然不是TreeBuilder.getBaseUri(),那么返回<base href>的值的方法是什么? (2) 在Jsoup's source code 中,我可以在哪里找到仅从 HTML 导出 baseUri 的“魔力”?
    • TreeBuilderState line 97中设置,在<base>之后创建的所有节点中的Node#getBaseUri()可用。
    • 您的意思可能是Node#baseUri()。现在让我真正感到困惑的是:当调用parse() baseUri 表示 *full URL 路径。但是当调用Node#baseUri() 时,它只意味着<base> URL...看到不对称了吗?同样Node#baseUri() 也不能保证被正确初始化,那么它会返回什么呢?最后,即使没有<base> 存在,是否可以从 HTML 页面派生出有效的 baseUri? +1,000,000
    • 如果在parse() 期间设置了baseUri,它将被用作基本URL。一旦 Jsoup 发现 <base>,它将被使用。如果在parse() 期间未设置baseUri,则它将保持为空,直到出现<base>。除了直接在 URL 上使用 connect() 而不是在字符串上使用 parse() 之外,实际上没有其他方法可以知道请求 HTML 文件的原始 URL。 HTML 文档不包含该信息。
    • 我不确定这有什么关系,因为您通常希望使用Node#absUrl() 来获取 URL 属性的最终绝对 URL 以进行进一步解析,而不必自己担心 Node#baseUri()
    猜你喜欢
    • 2011-07-20
    • 2016-03-23
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2017-04-23
    • 2014-01-16
    • 2022-07-06
    • 2021-04-26
    相关资源
    最近更新 更多