解析与JTidy的链接
我目前正在使用JTidy解析HTML文档并获取给定HTML文档中所有锚定标记的集合。然后,我提取每个标签的href属性的值,以在页面上创建一个链接集合。解析与JTidy的链接
不幸的是,这些链接可以在几个不同的方式表达:一些绝对(http://www.example.com/page.html
),一些相对(/page.html
,page.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?
假设您可以计算出使用哪种上下文,那么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。
你最好的最好的是最有可能遵循同样的决议过程,浏览器确实如outlined in the HTML spec:
用户代理必须计算根据下面的 优先级URI基地(最高优先级到最低):
- 基本URI由BASE元素设置。
- 基本URI由在协议交互期间发现的元数据给出,例如HTTP头(参见[RFC2616])。
- 默认情况下,基本URI是当前文档的基本URI。并非所有的HTML文档都有一个基本的URI(例如,一个有效的HTML文档可能在电子邮件中出现 ,并且可能不会被URI指定)。如果这些HTML文档 包含相对URI并且依赖于默认的基本URI,则被认为是错误的。
在实践中,你可能最关心的是数字1和2(即检查是否有<base href="..."
和使用,要么(如果存在)或当前文档的URI)。