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

Fra*_*ero 1 java jsoup

今天我开始“玩”了JSoup。我想知道有多强大JSoup,所以我寻找了一个包含很多元素的网页,并试图检索所有元素。我找到了我要找的东西:http : //www.top1000.ie/companies

这是一个包含许多相似元素 (1000) 的列表(列表中的每个公司)。只需更改其中的文本,以便我尝试检索的是该文本,但我只能获取前 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());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我认为可能是页面没有时间加载,所以这就是我.timeout(1000*5)等待 5 秒但我只能获取列表的前 20 个元素的原因。

JSoup您可以从网页中检索的元素数量是否有限制?我认为不应该,因为它似乎是为此目的而准备的,所以我认为我的代码中遗漏了一些东西。

任何帮助,将不胜感激。提前致谢!

luk*_*sch 5

新答案:

我查看了您要解析的网站。问题是,只有前 20 个 comanpies 加载了该站点的第一次调用。其余部分通过 AJAX 加载。而且 Jsoup 不解释或运行 JavaScript。您可以为此使用 selenium webdriver,或者直接找出 AJAX 调用。

老的:

Jsoup 限制为 1M,如果没有通过maxBodySize()方法另行通知。所以你可能想要这样做:

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();
Run Code Online (Sandbox Code Playgroud)

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