3 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊
JSoup是一個(gè)HTML解析器,而不是某種嵌入式瀏覽器引擎。這意味著它完全沒有意識(shí)到在初始頁面加載后由Javascript添加到DOM的任何內(nèi)容。
要訪問這種類型的內(nèi)容,您需要一個(gè)嵌入式瀏覽器組件,關(guān)于這種組件有很多關(guān)于SO的討論,例如,有沒有辦法在Java中嵌入瀏覽器?

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
用com.codeborne.phantomjsdriver解決了我的情況注意:它是groovy代碼。
的pom.xml
<dependency> <groupId>com.codeborne</groupId> <artifactId>phantomjsdriver</artifactId> <version> <here goes last version> </version> </dependency>
PhantomJsUtils.groovy
import org.jsoup.Jsoupimport org.jsoup.nodes.Documentimport org.openqa.selenium.WebDriverimport org.openqa.selenium.phantomjs.PhantomJSDriverclass 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))

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
你需要了解發(fā)生了什么:
當(dāng)您從網(wǎng)站查詢頁面時(shí),無論是使用Jsoup還是瀏覽器,返回給您的是一些HTML。Jsoup能夠解析它。
但是,大多數(shù)網(wǎng)站都包含該HTML中的Javascript,或者從該HTML鏈接,該HTML將使用內(nèi)容填充頁面。您的瀏覽器能夠執(zhí)行Javascript,從而填充頁面。Jsoup不是。
理解這一點(diǎn)的方法如下:解析HTML代碼很容易。執(zhí)行Javascript代碼和更新相應(yīng)的HTML代碼要復(fù)雜得多,并且是瀏覽器的工作。
以下是針對(duì)此類問題的一些解決方案:
如果您可以找到Javascript代碼正在進(jìn)行的Ajax調(diào)用,即加載內(nèi)容,您可以使用Jsoup使用這些調(diào)用的URL。為此,請(qǐng)使用瀏覽器中的Developer Tools。但這不能保證工作:
可能是url是動(dòng)態(tài)的,并且取決于當(dāng)時(shí)頁面上的內(nèi)容
如果內(nèi)容不公開,將涉及cookie,而僅僅查詢資源URL是不夠的
在這些情況下,您需要“模擬”瀏覽器的工作。幸運(yùn)的是,存在這樣的工具。我知道并推薦的是PhantomJS。它適用于Javascript,您需要通過啟動(dòng)新進(jìn)程從Java啟動(dòng)它。如果你想堅(jiān)持Java,這篇文章列出了一些Java備選方案。
添加回答
舉報(bào)