Java 为什么JSoup不读取页面的所有元素?

Java 为什么JSoup不读取页面的所有元素?,java,jsoup,Java,Jsoup,今天我开始和JSoup一起玩。我想知道JSoup有多强大,所以我寻找了一个包含很多元素的网页,并试图检索所有元素。我找到了我要找的东西: 这是一个包含许多元素的列表,这些元素与列表中的每个公司都相似。只需更改其中的文本,我就可以尝试检索该文本,但我只能获取前20个元素,而不能获取其余元素 这是我的简单代码: package retrieveInfo; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsou

今天我开始和JSoup一起玩。我想知道JSoup有多强大,所以我寻找了一个包含很多元素的网页,并试图检索所有元素。我找到了我要找的东西:

这是一个包含许多元素的列表,这些元素与列表中的每个公司都相似。只需更改其中的文本,我就可以尝试检索该文本,但我只能获取前20个元素,而不能获取其余元素

这是我的简单代码:

package retrieveInfo;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Retrieve {

    public static void main(String[] args) throws Exception{
        String url = "http://www.top1000.ie/companies";
        Document document = Jsoup.connect(url)
                 .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
                 .timeout(1000*5)
                 .get();

        Elements companies = document.body().select(".content .name");
        for (Element company : companies) {
            System.out.println("Company: " + company.text());
        }
    }

}
我认为这可能是因为页面没有时间加载,所以我将.timeout1000*5放入等待5秒,但我只能获取列表的前20个元素

JSoup是否限制了可以从网页中检索的元素?我认为不应该这样做,因为它似乎是为这个目的而准备的,所以我认为我的代码中缺少了一些东西

任何帮助都将不胜感激。提前谢谢

新答案: 我看了你试图解析的网站。问题是,只有前20家公司加载了该站点的第一个调用。其余的通过AJAX加载。Jsoup不解释或运行JavaScript。您可以使用SeleniumWebDriver实现这一点,或者直接解决AJAX调用

旧的: 如果未通过该方法另行告知,则Jsoup限制为1M。因此,您可能需要执行以下操作:

Document document = Jsoup.connect(url)
             .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
             .maxBodySize(0)
             .timeout(1000*5)
             .get();
请注意,以上内容完全关闭了大小限制。这可能不是一个好主意,因为Jsoup在内存中构建DOM,所以您可能会遇到大型文档的内存堆大小问题。如果您确实遇到类似的问题,切换到另一个基于SAX的HTML解析器可能会有所帮助。

新答案: 我看了你试图解析的网站。问题是,只有前20家公司加载了该站点的第一个调用。其余的通过AJAX加载。Jsoup不解释或运行JavaScript。您可以使用SeleniumWebDriver实现这一点,或者直接解决AJAX调用

旧的: 如果未通过该方法另行告知,则Jsoup限制为1M。因此,您可能需要执行以下操作:

Document document = Jsoup.connect(url)
             .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")
             .maxBodySize(0)
             .timeout(1000*5)
             .get();

请注意,以上内容完全关闭了大小限制。这可能不是一个好主意,因为Jsoup在内存中构建DOM,所以您可能会遇到大型文档的内存堆大小问题。如果您确实遇到类似的问题,那么切换到另一个基于SAX的HTML解析器可能会有所帮助。

该站点最初只加载前20个元素。当您向下滚动时,下一个元素块由一个脚本加载到POST。然后,脚本将收到的元素添加到DOM中

但是,您从/companys?page=的帖子中得到的响应是JSON

{
 "worked":true,
 "has_more":true,
 "next_url":"/companies?page=3",
 "html":"..."
 ...
}
这里的html字段似乎包含将添加到DOM中的元素

使用Jsoup获取数据将是乏味的,因为Jsoup将在实际JSON周围添加所有类型的标记,并且还将转义某些字符

我认为您最好使用所描述的方法之一,一页一页地连接并阅读数据

这里是一个关于如何使用HttpURLConnection和解析器解决此问题的简单示例

在这里,我们使用HttpURLConnection向URL发送一个POST请求,而不发送任何数据,使用JSON解析器从结果中获取html字段,然后使用Jsoup对其进行解析。
只需在循环中为您想要阅读的页面调用该方法。

站点最初仅加载前20个元素。当您向下滚动时,下一个元素块由一个脚本加载到POST。然后,脚本将收到的元素添加到DOM中

但是,您从/companys?page=的帖子中得到的响应是JSON

{
 "worked":true,
 "has_more":true,
 "next_url":"/companies?page=3",
 "html":"..."
 ...
}
这里的html字段似乎包含将添加到DOM中的元素

使用Jsoup获取数据将是乏味的,因为Jsoup将在实际JSON周围添加所有类型的标记,并且还将转义某些字符

我认为您最好使用所描述的方法之一,一页一页地连接并阅读数据

这里是一个关于如何使用HttpURLConnection和解析器解决此问题的简单示例

在这里,我们使用HttpURLConnection向URL发送一个POST请求,而不发送任何数据,使用JSON解析器从结果中获取html字段,然后使用Jsoup对其进行解析。
只需在循环中为您想要阅读的页面调用该方法。

Jsoup的哪个版本?@avgvstvs最新版本:1.9.1 Jsoup的哪个版本?@avgvstvs最新版本:1.9.1为什么将其设置为0?我以前也尝试过在maxBodySize中添加2MB,但我只得到相同的20个元素。还有你的解决方案。此外,老实说,我不认为20个短语可以占用1MB的容量。请看我修改后的答案。谢谢你提供更多信息。现在我可以从两个答案中看出问题出在AJAX上,我以前没有注意到。获取此信息的最佳库是什么?最简单的可能是@nyname00描述的方式。所以使用POST请求

带有页面参数的将为您提供带有嵌入html的JSON答案。解析JSON之后,您可能仍然可以将html属性馈送到JSoup中,以解析您感兴趣的内容。为什么将其设置为0?我以前也尝试过在maxBodySize中添加2MB,但我只得到相同的20个元素。还有你的解决方案。此外,老实说,我不认为20个短语可以占用1MB的容量。请看我修改后的答案。谢谢你提供更多信息。现在我可以从两个答案中看出问题出在AJAX上,我以前没有注意到。获取此信息的最佳库是什么?最简单的可能是@nyname00描述的方式。因此,使用带有页面参数的POST请求将为您提供带有嵌入式html的JSON答案。在解析JSON之后,您可能仍然可以将html属性馈送到JSoup中,以解析您感兴趣的内容。分析不错,比我修改的答案快一点+1:谢谢你的分析,但我有一些疑问:1。你是怎么得到JSON的?2.在另一篇文章中,你认为哪种方式是最好的?再次感谢你@错误404我正在使用Chrome开发者工具检查网络流量。如果您像@luksch所建议的那样对Selenium或Webdriver有一些经验,您可以尝试一下,但是使用JSON解析器的简单http请求将是我的第一个选择choice@nyname00我在开发web应用程序方面是个新手,所以我可能误解了你。你想使用HttpURLConnection吗。很抱歉,我不知道如何在注释中的单词上添加链接。@Error404是的,或者Apache-HttpClient,两者都可以。请参阅,了解教程中的NICE分析,并比我修改后的答案快一点+1:谢谢你的分析,但我有一些疑问:1。你是怎么得到JSON的?2.在另一篇文章中,你认为哪种方式是最好的?再次感谢你@错误404我正在使用Chrome开发者工具检查网络流量。如果您像@luksch所建议的那样对Selenium或Webdriver有一些经验,您可以尝试一下,但是使用JSON解析器的简单http请求将是我的第一个选择choice@nyname00我在开发web应用程序方面是个新手,所以我可能误解了你。你想使用HttpURLConnection吗。很抱歉,我不知道如何在注释中的单词上添加链接。@Error404是的,或者Apache-HttpClient,两者都可以。有关教程,请参见