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{
        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();
     }
   }
}

异常(exception):

java.lang.NullPointerException
JSOUPTester.main(JSOUPTester.java:7)

我已在 chrome 中检查这些页面包含 id 为“用户名”和“密码”的元素。 上面的行抛出 NullPointerException。我在这里做错了什么?

最佳答案

造成这种情况的原因有很多。如果没有 URL,我无法确定,但这里有一些线索:

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

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

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

    Jsoup.connect("url").userAgent("Mozilla/5.0")

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

    Jsoup.connect("url").maxBodySize(0)

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

    Jsoup.connect("url").timeout(毫秒)

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

关于java - 使用 Jsoup 从页面获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35323308/

相关文章:

java - HashMap 可以有一个由 2 个值组成的键吗?

java - Mockito 模拟一个返回值并验证它

java - Jsoup 无法选择 p 元素作为父元素

Java Scanner 无法获取所有行

java - 带有Eureka依赖的Spring启动无法启动

java - 循环运行多次,不知道为什么

java - Jsoup 将我的 javascript 字符串转换为一行

java - 使用 jsoup 获取元素外部但元素旁边的文本

java - 阻止 Jsoup 获取 Http 响应

java - Jsoup 解析器仅针对特定 URL 无法按预期工作