尽管状态代码检查,jsoup 仍抛出 204 状态

jsoup throws 204 status despite a status code check

虽然我通过 jsoup 连接到 url。这是我的代码片段:

  for (int j = 0; j < unq_urls.size(); j++) {

      Response response2 = Jsoup.connect(unq_urls.get(j))
             .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
             .timeout(100*1000)
             .ignoreContentType(true)
             .execute();

      if (response2.statusCode() == 200) {
...}

}

执行连接时jsoup抛出如下错误:

org.jsoup.HttpStatusException: HTTP error fetching URL. Status=204, URL=https://www.google.com/gen_204?reason=EmptyURL
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:459)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:475)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:475)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:434)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:181)
    at cseapiandparsing.CSE_Author_Name_Dis.<init>(CSE_Author_Name_Dis.java:187)
    at cseapiandparsing.CSE_Author_Name_Dis.main(CSE_Author_Name_Dis.java:263)

我该如何克服这个问题?我的意思是如果 jsoup 无法连接到特定的 URL,我希望它传递另一个 URL。与此相关的jsoup在连接URL花费太多时间时也会抛出超时错误。为此,我已经设置了 .timeout(100*1000) 选项。但是,我想知道如果当前的尝试时间太长,是否有一种方法可以传递给另一个 URL?

提前致谢。

我相信您正在寻找一种 try-catch 机制。

try 子句包围 Jsoup.connect 部分,然后在你的 catch 子句中优雅地处理异常,在你的情况下,这将是 continuing 进入下一个循环。

跳过当前的,如果它花费的时间太长,只需将timeout()值设置为您想要的等待时间,如果超过该时间,它将抛出超时异常,将再次被 catch 子句捕获。 尝试我在下面发布的代码:

for (int j = 0; j < unq_urls.size(); j++) {
  try{
      Response response2 = Jsoup.connect(unq_urls.get(j))
         .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
         .timeout(100*1000)
         .ignoreContentType(true)
         .execute();
  } catch(Exception e) {
      continue; //continue to the next loop if exception occurs
  }
}