Jsoup 和 HttpClient 无法看到页面内容

Page content couldn't be seen by Jsoup and HttpClient

提问人:Simon Zhao 提问时间:1/27/2023 最后编辑:Simon Zhao 更新时间:1/28/2023 访问量:87

问:

嗨,我想从网站上删除信息,所以我尝试使用 Jsoup(也尝试了 HttpClient)来这样做。我意识到他们俩都无法“看到”html页面的某些内容。所以当我尝试打印出解析后的 html 时,我得到了这样的空 div。它可以很好地打印出其他一些div。
这是我的代码:

Class Main{

  public static void main(String args[]) throws IOException, InterruptedException {
    
    Document doc = Jsoup.connect(url).get();
    System.out.println(doc.getElementsByClass("needed content"));
  }
}

终端中的结果是:

<div class="needed content"></div> 

我正在 stackoverflow 上寻找答案,有人推荐使用 Jackson Library Java - 如何使用 JSoup 访问 Div 的子

有人建议在 java 中嵌入浏览器 有没有办法在 Java 中嵌入浏览器?

有人推荐使用 htmlunit 无法通过 JSoup 获取页面的完整内容

我刚刚尝试将 Jsoup 与 html unit 结合使用,相同的结果如下:

        try(WebClient wc = new WebClient()){  
        wc.getOptions().setJavaScriptEnabled(true); 
        wc.getOptions().setCssEnabled(false);  
        wc.getOptions().setThrowExceptionOnScriptError(false); 
        wc.getOptions().setTimeout(10000); 
        HtmlPage page = wc.getPage("https://chainlinklabs.com/jobs");  
        String pageXml = page.asXml();  
        

         
        Document doc2 = Jsoup.parse(pageXml, url);   
        System.out.println(doc2.getElementsByClass("needed content"));
  
        System.out.println("Thank God!"); 
        }

我对这个问题的解释是 Jsoup 没有显示部分 html 内容,因为它包含 javascript;我正朝着正确的方向前进吗?

java httpclient jsoup html 解析

评论


答:

0赞 RBRi 1/27/2023 #1

没有必要(而且浪费资源)将页面从 HtmlUnit 重新解析为 jsoup。所有选择选项在 HtmlUnit 中也可用(参见 https://htmlunit.sourceforge.io/gettingStarted.html) - 也许还有更多。

这个简单的代码对我有用 - 页面的某些部分是由异步启动的 js 脚本生成的。因此,您必须等待这些脚本才能访问该页面。

public static void main(String[] args) throws IOException {
    String url = "https://chainlinklabs.com/jobs";

    try (final WebClient webClient = new WebClient()) {
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScriptStartingBefore(10_000);

        // System.out.println("--------------------------------");
        // System.out.println(page.asXml());
        // System.out.println("--------------------------------");


        System.out.println("- Jobs -------------------------");
        final DomNodeList<DomNode> jobTitles = page.querySelectorAll(".job-title");
        for (DomNode domNode : jobTitles) {
            System.out.println(domNode.asNormalizedText());
        }
        System.out.println("--------------------------------");

    }
}

评论

0赞 Simon Zhao 1/28/2023
谢谢你!这是完全有道理的!非常感谢。