java Jsoup和HttpClient无法看到页面内容

jchrr9hc  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(159)

嗨,我想从一个网站上删除信息,所以我试着用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的子程序
一些人建议在JavaIs there a way to embed a browser in Java?中嵌入浏览器
有些人建议使用htmlunitFail to get full content of page with JSoup
我刚刚尝试结合Jsoup与html单元,同样的结果这里的代码:

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;我走的方向对吗?

gblwokeq

gblwokeq1#

没有必要(这是一种资源浪费)将页面从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("--------------------------------");

    }
}

相关问题