为什么这个特定网站在以编程方式解析时会自动格式化日期?

时间:2017-03-07 03:52:00

标签: date io web-scraping jsoup

我正在尝试使用Jsoup 1.10.1从网站获取某些链接的列表。以下是我从代码的其余部分中隔离出来以尝试诊断问题的代码段:

    public static void main(String[] args) throws IOException {
        URL link = new URL("https://www.ncdc.noaa.gov/gibbs/availability/1979-01-01");
        Document doc = Jsoup.parse(link, 600);
        Elements links = doc.select(".availableChannels > a");
        System.out.println(links.get(0));
    }

理论上,这应该打印出所提供的URL上.availableChannels类下的第一个链接的内容,该链接应为<a href="/gibbs/html/GMS-1/IR/1979-01-01-00" title="GMS-1 IR 0-UTC"> IR </a>

但是,Jsoup会自动格式化a href中显示的yyyy-mm-dd日期,因此代码段打印出<a href="/gibbs/html/GMS-1/IR/Mon Jan 01 00:00:00 EST 1979-0" title="GMS-1 IR 0-UTC"> IR </a>,这是不受欢迎的。

如何阻止Jsoup自动格式化日期?

更新

我决定在Python 2.7中编写一个类似的程序,看看如果我从该特定页面(https://www.ncdc.noaa.gov/gibbs/availability/1979-01-01)读取会发生什么。事实证明,当我打开并使用python打印页面的源时,<a href="/gibbs/html/GMS-1/IR/1979-01-01-00" title="GMS-1 IR 0-UTC"> IR </a>中显示的yyyy-mm-dd 仍然格式化为<a href="/gibbs/html/GMS-1/IR/Mon Jan 01 00:00:00 EST 1979-0" title="GMS-1 IR 0-UTC"> IR </a>。 / p>

import urllib

link = "https://www.ncdc.noaa.gov/gibbs/availability/1979-01-01";
f = urllib.urlopen(link);
myfile = f.read();
print myfile;

我想问题就变成了:为什么这个特定网站会在通过非标准网络浏览器访问时自动格式化日期?我已经相应地更改了问题以反映这一点。

1 个答案:

答案 0 :(得分:0)

这是因为您需要在HTTP请求上设置Accept-Language标头。

  

Accept-Language请求HTTP标头通告哪种语言   客户端能够理解,并且首选哪种语言环境变体。   使用内容协商,服务器然后选择其中一个   提案,使用它并通知客户其选择   内容 - 语言响应标头。 (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language

因此,如果您没有设置标题,托管网站的服务器会返回一个不使用您在浏览器中看到的首选本地时间设置的变体。

public static void main(String[] args) throws IOException {
    URL link = new URL("https://www.ncdc.noaa.gov/gibbs/availability/1979-01-01");

    Document doc = Jsoup.connect(link.toString())
            .header("Accept-Language", "en-GB").get();
    Elements links = doc.select(".availableChannels > a");
    System.out.println(links.get(0));
}

输出: <a href="/gibbs/html/GMS-1/IR/1979-01-01-00" title="GMS-1 IR 0-UTC"> IR </a>