如何让Jsoup等待完整页面加载(跳过进度页面)?

6

我正在尝试使用Jsoup解析网页并提取数据。但是链接是动态的,在显示详细信息之前会出现等待加载页面。因此,Jsoup似乎会处理等待页面而不是详细页面。有没有办法等待页面完全加载后再进行处理?


1
请问您能否添加URL和真实示例? - Davide Pastore
你可以在这里尝试使用ui4j而不是Jsoup:https://github.com/ui4j/ui4j。 - Stephan
3个回答

6

如果页面加载后某些内容是动态创建的,那么您最好使用Selenium和JSoup来解析全部内容:

WebDriver driver = new FirefoxDriver();
driver.get("http://stackoverflow.com/");
Document doc = Jsoup.parse(driver.getPageSource());

同样,在这里,如果我尝试解析的网页有Java脚本,则它不会等待执行,而是会出现等待或加载页面。因此,等待元素加载而不是立即使用jsoup进行解析可能是更好的方法。这似乎对我有用。也许由于我的初始问题包括Jsoup的使用,您的答案也包括了jsoup。也许我应该更好地表达我的问题。谢谢! - Thiru

3

很可能,这个页面是由浏览器中的JavaScript(客户端)生成的。Jsoup不解释JavaScript,所以你就没那么幸运了。不过,你可以在浏览器开发者工具的网络选项卡中分析页面加载,并找出在页面加载期间进行的哪些AJAX调用。这些调用也有URL,你可以通过直接访问它们来获取所有需要的信息。或者,你可以使用一个真正的浏览器引擎来加载页面。你可以使用像selenium webdriver这样的库,或者如果你使用的是Java 8,可以使用JavaFX webkit组件。


0

我认为我只是在扩展luksch的答案。我不熟悉Web框架,所以这个答案看起来有点难以理解。由于页面使用像Jsoup这样的解析器动态加载是困难的,因为我们必须知道所有元素在尝试解析之前是否完全加载。因此,不要立即解析,而是使用webdriver(selenium)检查元素状态,一旦它们被加载,获取页面源并解析或使用webdriver本身收集所需的数据,而不是使用单独的解析器。

WebDriver driver = new ChromeDriver();
    driver.get("<DynamicURL>");
    List<WebElement> elements = null;
    while (elements == null)
    {
        elements = driver.findElements(By.className("marker"));
        if (!valuePresent(elements))
        {
            elements = null;
        }
    }
    if (elements != null)
    {
        processElements(elements);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接