2011-12-19 111 views
1

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

不幸的是,这些链接可以在几个不同的方式表达:一些绝对(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?

回答

3

假设您可以计算出使用哪种上下文,那么vanilla URL类可能会为您带来大部分的途径。下面是一些例子:

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; 
     } 
    } 
} 

结果:

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。

1

你最好的最好的是最有可能遵循同样的决议过程,浏览器确实如outlined in the HTML spec

用户代理必须计算根据下面的 优先级URI基地(最高优先级到最低):

  1. 基本URI由BASE元素设置。
  2. 基本URI由在协议交互期间发现的元数据给出,例如HTTP头(参见[RFC2616])。
  3. 默认情况下,基本URI是当前文档的基本URI。并非所有的HTML文档都有一个基本的URI(例如,一个有效的HTML文档可能在电子邮件中出现 ,并且可能不会被URI指定)。如果这些HTML文档 包含相对URI并且依赖于默认的基本URI,则被认为是错误的。

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