Java 使用Jsoup从页面获取元素

Java 使用Jsoup从页面获取元素,java,jsoup,Java,Jsoup,我想使用Jsoup登录到https网站,然后调用3-4服务来检查作业是否完成 public class JSOUPTester { public static void main(String[] args){ System.out.println("Inside the JSOUP testing method"); String url = "https://someloginpage.com"; try{ Docume

我想使用Jsoup登录到https网站,然后调用3-4服务来检查作业是否完成

    public class JSOUPTester {
    public static void main(String[] args){
        System.out.println("Inside the JSOUP testing method");
        String url = "https://someloginpage.com";
    try{
        Document doc = Jsoup.connect(url).get();
        String S = doc.getElementById("username").text();// LINE 1
        String S1 = doc.getElementById("password").text();// LINE 2
    }catch(Exception e){
         e.printStackTrace();
     }
   }
}
例外情况:

java.lang.NullPointerException
JSOUPTester.main(JSOUPTester.java:7)
我已经在chrome上检查过,这些页面包含id为“username”和“password”的元素。
上面的行正在抛出NullPointerException。我做错了什么?

很多事情都可能是原因。如果没有URL,我无法确定,但以下是一些线索:

  • 有些页面通过AJAX加载内容。Jsoup无法处理这个问题,因为它不解释任何JavaScript。您可以通过使用curl下载页面,或者在关闭JavaScript的同时在浏览器中进行检查。要处理使用JavaScript呈现自身的页面,可以使用SeleniumWebDriver或HTMLUnit等工具

  • 您尝试加载的页面的Web服务器可能需要存在cookie。您需要查看在加载该页面时发生的网络流量。在chrome或firefox中,您可以在网络选项卡的开发者工具中看到这一点

  • Web服务器可能会对不同的客户端做出不同的响应。这就是为什么您可能必须在JSoup http请求中将UserAgent字符串设置为已知浏览器的原因

    Jsoup.connect(“url”).userAgent(“Mozilla/5.0”)

  • 对于下载的html源代码,JSoup的大小限制为1MB。如果需要,可以将其关闭或设置为更大的值

    Jsoup.connect(“url”).maxBodySize(0)

  • Jsoup可能会在请求时超时。要更改超时行为,请使用

    Jsoup.connect(“url”).timeout(毫秒)

  • 可能还有其他我现在没有想到的原因


您能分享一下例外情况吗?非常感谢您提供了如此详细的分析。是的,元素确实是通过Ajax加载的,在这种情况下,我应该怎么做?也许您可以找出Ajax调用的URL,并直接使用Jsoup调用它们。通常,响应不是HTML格式,而是JSON格式,因此您需要一个不同的解析器。或者,如上所述,您可以使用SeleniumWebDriver,它控制真实的浏览器来呈现HTML。