提问人:Simon Zhao 提问时间:1/27/2023 最后编辑:Simon Zhao 更新时间:1/28/2023 访问量:87
Jsoup 和 HttpClient 无法看到页面内容
Page content couldn't be seen by Jsoup and HttpClient
问:
嗨,我想从网站上删除信息,所以我尝试使用 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;我正朝着正确的方向前进吗?
答:
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
谢谢你!这是完全有道理的!非常感谢。
评论