【问题标题】:Open a connection with Jsoup, get status code and parse document用Jsoup打开连接,获取状态码并解析文档
【发布时间】:2017-04-21 15:39:45
【问题描述】:

我正在使用 jsoup 创建一个类,它将执行以下操作:

  1. 构造函数打开一个到 url 的连接。
  2. 我有一个方法可以检查页面的状态。即 200、404 等。
  3. 我有一个方法可以解析页面并返回一个 url 列表。#

下面是我正在尝试做的粗略工作,不是很粗略,因为我一直在尝试很多不同的事情

public class ParsePage {
private String path;
Connection.Response response = null;

private ParsePage(String langLocale){
    try {
        response = Jsoup.connect(path)
                .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                .timeout(10000)
                .execute();
    } catch (IOException e) {
        System.out.println("io - "+e);
    }
}

public int getSitemapStatus(){
    int statusCode = response.statusCode();
    return statusCode;
}

public ArrayList<String> getUrls(){
    ArrayList<String> urls = new ArrayList<String>();

 }
}

如您所见,我可以获取页面状态,但是使用构造函数中已经打开的连接我不知道如何获取要解析的文档,我尝试使用:

Document doc = connection.get();

但那是不行的。有什么建议么?或者有更好的方法来解决这个问题?

【问题讨论】:

    标签: java jsoup connection


    【解决方案1】:

    正如 Connection.Response 类型的 JSoup 文档中所述,有一个 parse() 方法将响应的主体解析为 Document 并返回它。 当你拥有它时,你可以用它做任何你想做的事情。

    例如看getUrls()的实现

    public class ParsePage {
       private String path;
       Connection.Response response = null;
    
       private ParsePage(String langLocale){
          try {
             response = Jsoup.connect(path)
                .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                .timeout(10000)
                .execute();
          } catch (IOException e) {
             System.out.println("io - "+e);
          }
       }
    
       public int getSitemapStatus() {
          int statusCode = response.statusCode();
          return statusCode;
       }
    
       public ArrayList<String> getUrls() {
          ArrayList<String> urls = new ArrayList<String>();
          Document doc = response.parse();
          // do whatever you want, for example retrieving the <url> from the sitemap
          for (Element url : doc.select("url")) {
             urls.add(url.select("loc").text());
          }
          return urls;
       }
    }
    

    【讨论】:

      【解决方案2】:

      如果您不需要登录,请使用:

      Document doc = Jsoup.connect("url").get();
      

      如果您确实需要登录,我建议您使用:

      Response res = Jsoup.connect("url")
          .data("loginField", "yourUser", "passwordField", "yourPassword")
          .method(Method.POST)
          .execute();
      Document doc = res.parse();
      
      //If you need to keep logged in to the page, use
      Map<String, String> cookies = res.cookies;
      
      //And by every consequent connection, you'll need to use
      Document pageWhenAlreadyLoggedIn = Jsoup.connect("url").cookies(cookies).get();
      

      在您获取网址时,我可能会尝试

      Elements elems = doc.select(a[href]);
      for (Element elem : elems) {
          String link = elem.attr("href");
      }
      

      就是这样......继续努力

      【讨论】:

        【解决方案3】:

        您应该能够在响应对象上调用 parse()。

        Document doc = response.parse();
        

        【讨论】:

          【解决方案4】:

          您的情况似乎是您想与 jsoup 建立连接然后检查状态代码,然后根据您将解析的状态代码或您想做的任何事情。

          为此,您首先必须检查 URL 的状态代码,而不是创建连接。

            Response response = Jsoup.connect("Your Url ").followRedirects(false).execute();
                  System.out.println(response.statusCode() + " : " + response.url());
          

          response.statusCode() 会返回状态码

          之后你可以创建你的连接

           if (200 == response.statusCode()) {
                  doc = Jsoup.connect(" Your URL").get();
                  Elements elements = doc.select("href");
                  /* what ever you want to do*/
                }
          

          您的课程将如下所示

          package com.demo.soup.core;
          
          import java.io.IOException;
          
          import org.jsoup.Connection.Response;
          import org.jsoup.Jsoup;
          import org.jsoup.nodes.Document;
          
          /**
           * The Class DemoConnectionWithJsoup.
           *
           * @author Ankit Sood Apr 21, 2017
           */
          public class DemoConnectionWithJsoup {
          
              /**
               * The main method.
               *
               * @param args
               *            the arguments
               */
              public static void main(String[] args) {
              Response response;
              try {
                  response = Jsoup.connect("Your URL ").followRedirects(false).execute();
          
                  /* response.statusCode() will return you the status code */
                  if (200 == response.statusCode()) {
                  Document doc = Jsoup.connect("Your URL").get();
          
                  /* what ever you want to do */
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
          
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-23
            • 2011-10-30
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-13
            相关资源
            最近更新 更多