解析HTML以获取Web链接,一些链接在URL中显示:80。为什么是这样?

时间:2012-01-07 22:39:35

标签: java port jsoup

我正在使用JTidy解析HTML页面以提取页面链接。我在几个网页上测试它,其中一个是www.support.xbox.com。一些链接在URL中显示:80,例如

http://support.xbox.com:80/en-US/xbox-360/disc-drive/disc-replacement-program http://support.xbox.com:80/en-US/xbox-live/marketplace-and-purchasing/play-xbox-live-content http://support.xbox.com:80/en-US/games/call-of-duty/call-of-duty-elite-subscription

我认为:80表示正在使用的端口,但为什么会这样?

不确定我的代码是否需要,但无论如何都是这样!

package urltest;

import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import org.jsoup.Connection;

public class UrlTest {

public static void main(String[] args) throws IOException {
    String url = "http://support.xbox.com";
    print("Fetching %s...", url);

    Document doc = Jsoup.connect(url).timeout(0).get();
    Elements links = doc.select("div#BodyContent a[href]");

    print("\nLinks: (%d)", links.size());
    for (Element link : links) {
        print("%s  (%s)", link.attr("abs:href"), trim(link.text(), 35));
    }
}

private static void print(String msg, Object... args) {
    System.out.println(String.format(msg, args));
}

private static String trim(String s, int width) {
    if (s.length() > width)
        return s.substring(0, width-1) + ".";
    else
        return s;
}
}

2 个答案:

答案 0 :(得分:2)

如果您使用浏览器并输入

  

www.stackoverflow.com

  

www.stackoverflow.com:80

你会得到相同的结果。因为浏览器隐式地将:80添加到代表http请求的端口号的所有地址。

现在为什么有些网站会添加它而有些网站没有,这取决于很多问题。但毕竟,它不会以任何方式影响你的程序

答案 1 :(得分:1)

如果您注意到重定向标题:

HTTP/1.1 302 Moved Temporarily
Cache-Control: private
Location: http://support.xbox.com:80/en-US/
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 0
Date: Sun, 08 Jan 2012 00:19:43 GMT
Connection: keep-alive

请注意,URL中的Location:字段包含端口号。这就是为什么在直接访问页面时没有获得端口号,而在通过重定向访问页面时获得端口号。

至于为什么网站发布了一个带有显式:80端口号的重定向,无论如何都应该是默认端口号,你必须询问网站所有者。