页面内容加载了 JavaScript,而 Jsoup 看不到它

2022-09-01 01:04:57

页面上的一个块由JavaScript填充内容,并且在使用Jsoup加载页面后,没有这些信息。有没有办法在解析页面时也获得JavaScript生成的内容?Jsoup

无法在此处粘贴页面代码,因为它太长:http://pastebin.com/qw4Rfqgw

以下是我需要的内容元素:<div id='tags_list'></div>

我需要在Java中获取此信息。最好使用 Jsoup。元素是借助 JavaScript 的字段:

<div id="tags_list">
    <a href="/tagsc0t20099.html" style="font-size:14;">разведчик</a>
    <a href="/tagsc0t1879.html" style="font-size:14;">Sr</a>
    <a href="/tagsc0t3140.html" style="font-size:14;">стратегический</a>
</div>

Java 代码:

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

import java.io.IOException;

public class Test
{
    public static void main( String[] args )
    {
        try
        {
            Document Doc = Jsoup.connect( "http://www.bestreferat.ru/referat-32558.html" ).get();
            Elements Tags = Doc.select( "#tags_list a" );

            for ( Element Tag : Tags )
            {
                System.out.println( Tag.text() );
            }
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }
    }
}

答案 1

JSoup是一个HTML解析器,而不是某种嵌入式浏览器引擎。这意味着它完全不知道在初始页面加载后由Javascript添加到DOM中的任何内容。

要访问这种类型的内容,您将需要一个嵌入式浏览器组件,关于SO的关于该类型组件的许多讨论,例如有没有办法在Java中嵌入浏览器?


答案 2

在我的情况下用com.codeborne.phantomjsdriver解决了注意:它是时髦的代码。

啪.xml

        <dependency>
          <groupId>com.codeborne</groupId>
          <artifactId>phantomjsdriver</artifactId>
          <version> <here goes last version> </version>
        </dependency>

PhantomJsUtils.groovy

import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.openqa.selenium.WebDriver
import org.openqa.selenium.phantomjs.PhantomJSDriver

class PhantomJsUtils {
    private static String filePath = 'data/temp/';

    public static Document renderPage(String filePath) {
        System.setProperty("phantomjs.binary.path", 'libs/phantomjs') // path to bin file. NOTE: platform dependent
        WebDriver ghostDriver = new PhantomJSDriver();
        try {
            ghostDriver.get(filePath);
            return Jsoup.parse(ghostDriver.getPageSource());
        } finally {
            ghostDriver.quit();
        }
    }

    public static Document renderPage(Document doc) {
        String tmpFileName = "$filePath${Calendar.getInstance().timeInMillis}.html";
        FileUtils.writeToFile(tmpFileName, doc.toString());
        return renderPage(tmpFileName);
    }
}

ClassInProject.groovy

Document doc = PhantomJsUtils.renderPage(Jsoup.parse(yourSource))