首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JTidy解析链接

使用JTidy解析链接
EN

Stack Overflow用户
提问于 2011-12-20 07:31:56
回答 2查看 1K关注 0票数 1

我目前正在使用JTidy解析一个超文本标记语言文档,并获取给定超文本标记语言文档中所有锚标记的集合。然后,我提取每个标记的href属性的值,以得到页面上的链接集合。

不幸的是,这些链接可以用几种不同的方式来表示:一些是绝对的(http://www.example.com/page.html),一些是相对的(/page.htmlpage.html../page.html)。更重要的是,有些只是锚(#paragraphA)。当我在浏览器中访问我的页面时,如果我单击链接,它会自动知道如何处理这些不同的href值,但是如果我要使用HTTPClient以编程方式使用从JTidy检索到的这些链接之一,我首先需要提供一个有效的URL (因此,我首先需要将/page.html、page.html和http://www.example.com/page.html转换为http://www.example.com/page.html)。

有没有一些内置的功能,无论是在JTidy中还是在其他地方,都可以为我实现这一点?或者我需要创建自己的规则来将这些不同的URL转换为绝对URL?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-20 08:16:07

假设您能够确定要使用的上下文,那么普通URL类可能会帮助您完成大部分工作。下面是一些示例:

代码语言:javascript
复制
package grimbo.url;

import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {
    public static void main(String[] args) {
        // context1
        URL c1 = u(null, "http://www.example.com/page.html");
        u(c1, "http://www.example.com/page.html");
        u(c1, "/page.html");
        u(c1, "page.html");
        u(c1, "../page.html");
        u(c1, "#paragraphA");

        System.out.println();

        // context2
        URL c2 = u(null, "http://www.example.com/path/to/page.html");
        u(c2, "http://www.example.com/page.html");
        u(c2, "/page.html");
        u(c2, "page.html");
        u(c2, "../page.html");
        u(c2, "#paragraphA");
    }

    public static URL u(URL context, String url) {
        try {
            URL u = null != context ? new URL(context, url) : new URL(url);
            System.out.println(u);
            return u;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

结果如下:

代码语言:javascript
复制
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/../page.html
http://www.example.com/page.html#paragraphA

http://www.example.com/path/to/page.html
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/path/to/page.html
http://www.example.com/path/page.html
http://www.example.com/path/to/page.html#paragraphA

正如您所看到的,有些结果并不是您想要的。因此,您可能会先尝试使用new URL(value)解析URL,如果结果是MalformedURLException,则可以尝试相对于上下文URL。

票数 3
EN

Stack Overflow用户

发布于 2011-12-20 07:57:44

最好的解决方案很可能遵循与浏览器相同的解析过程,就像outlined in the HTML spec一样

用户代理必须按照以下优先级(从高优先级到低优先级)计算基本URI:

  1. 基本URI由基本元素设置。
  2. 基本URI由协议交互过程中发现的元数据提供,如HTTP头(请参阅RFC2616)。
  3. 默认情况下,基本URI是当前文档的基本URI。并非所有HTML文档都具有基本URI (例如,有效的HTML文档可能出现在电子邮件中,并且可能不是由URI指定的)。如果这些超文本标记语言文档包含相对URI并依赖于缺省的基本URI,则认为它们是错误的。

在实践中,您最关心的可能是数字1和2(即检查<base href="..."并使用该URI (如果存在)或当前文档的URI)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8568976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档