Java Jsoup返回&;活动文本字段的名称

Java Jsoup返回&;活动文本字段的名称,java,html,web-scraping,jsoup,Java,Html,Web Scraping,Jsoup,所以它看起来很简单,但我无法检索这个网页上的文本,而且它似乎正在改变 package WorldBoss; import org.jsoup.nodes.Document; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.net.MalformedURLException; pu

所以它看起来很简单,但我无法检索这个网页上的文本,而且它似乎正在改变

package WorldBoss;


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

import java.io.IOException;
import java.net.MalformedURLException;

public class WorldBoss {

    public static void main(String [] args) throws MalformedURLException {
        Document page = null;
        try {
            page = Jsoup.connect("http://wiki.guildwars2.com/wiki/World_boss").get();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Elements allTimers = page.getElementsByClass("timerjs");
        String firstTime = allTimers.first().html();
        System.out.println(firstTime);
    }
}
它正在改变,因为它是一个倒计时

在页面的属性中,它表示innerHTML是正确的

有人知道我如何通过Jsoup获得这些信息吗


如果您想签出该页面,则该页面是可用的。

正如Pshemo在评论中提到的,Jsoup是一个html解析器,因此它既不会呈现页面,也不会在页面上执行脚本

为了成功地提取您想要的字段,我通过selenium使用phantomjs驱动程序对您的代码做了一些修改。使用phantom获取和呈现页面,页面源通过管道传输到Jsoup进行解析。找到下面的代码:

import org.jsoup.nodes.Document;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

public class WorldBoss {

    public static void main(String [] args) {

    WebDriver driver = new PhantomJSDriver(new DesiredCapabilities());
    driver.get("http://wiki.guildwars2.com/wiki/World_boss"); //retrieve page

    //It is very bad to wait explicitly, the best practice is to wait for a specific element on the page e.g. the element you're looking for [1]
    try { // wait to ensure page is loaded and java script is rendered
        Thread.sleep(3 * 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    String pageSource = driver.getPageSource();
    Document page = Jsoup.parse(pageSource);
    Elements allTimers = page.getElementsByClass("timerjs");

    for (Element timer : allTimers) {
        //you can get whichever timer you want with it's index
        String firstTime = timer.html().trim();
        if (firstTime.isEmpty()) continue;
        //use timer for whatever you want
        System.out.println(firstTime);
    }
}
}
我使用了maven,因此pom文件中的依赖项是:

    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.47.1</version>
    </dependency>
    <dependency>
        <groupId>com.github.detro.ghostdriver</groupId>
        <artifactId>phantomjsdriver</artifactId>
        <version>1.0.1</version>
    </dependency>
如果您的机器上没有安装phantomjs,您需要安装它才能工作。要在基于debian的设备上安装phantom,请执行以下操作:

sudo apt-get install phantomjs
对于其他平台(或从源代码构建)

希望这有帮助


  • 正如Pshemo在评论中提到的,Jsoup是一个html解析器,因此它既不呈现页面,也不在页面上执行脚本

    为了成功地提取您想要的字段,我通过selenium使用phantomjs驱动程序对您的代码做了一些修改。使用phantom获取和呈现页面,页面源通过管道传输到Jsoup进行解析。找到下面的代码:

    import org.jsoup.nodes.Document;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.phantomjs.PhantomJSDriver;
    import org.openqa.selenium.remote.DesiredCapabilities;
    
    public class WorldBoss {
    
        public static void main(String [] args) {
    
        WebDriver driver = new PhantomJSDriver(new DesiredCapabilities());
        driver.get("http://wiki.guildwars2.com/wiki/World_boss"); //retrieve page
    
        //It is very bad to wait explicitly, the best practice is to wait for a specific element on the page e.g. the element you're looking for [1]
        try { // wait to ensure page is loaded and java script is rendered
            Thread.sleep(3 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        String pageSource = driver.getPageSource();
        Document page = Jsoup.parse(pageSource);
        Elements allTimers = page.getElementsByClass("timerjs");
    
        for (Element timer : allTimers) {
            //you can get whichever timer you want with it's index
            String firstTime = timer.html().trim();
            if (firstTime.isEmpty()) continue;
            //use timer for whatever you want
            System.out.println(firstTime);
        }
    }
    }
    
    我使用了maven,因此pom文件中的依赖项是:

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.47.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.detro.ghostdriver</groupId>
            <artifactId>phantomjsdriver</artifactId>
            <version>1.0.1</version>
        </dependency>
    
    如果您的机器上没有安装phantomjs,您需要安装它才能工作。要在基于debian的设备上安装phantom,请执行以下操作:

    sudo apt-get install phantomjs
    
    对于其他平台(或从源代码构建)

    希望这有帮助


  • Jsoup不是浏览器模拟器,而是HTML解析器。这意味着它不支持JavaScript。尝试在不支持JavaScript的情况下在浏览器中加载该页面,您将看到带有
    timerjs
    类的每个元素都初始化为
     
    相同。尝试使用不同的工具,如SeleniumWeb驱动程序。Jsoup不是浏览器模拟器,而是HTML解析器。这意味着它不支持JavaScript。尝试在不支持JavaScript的情况下在浏览器中加载该页面,您将看到带有
    timerjs
    类的每个元素都初始化为
     
    相同。尝试使用不同的工具,如SeleniumWeb驱动程序。