3 回答

TA贡献1848条经验 获得超2个赞
JSoup是一个HTML解析器,而不是某种嵌入式浏览器引擎。这意味着它完全没有意识到在初始页面加载后由Javascript添加到DOM的任何内容。
要访问这种类型的内容,您需要一个嵌入式浏览器组件,关于这种组件有很多关于SO的讨论,例如,有没有办法在Java中嵌入浏览器?

TA贡献1815条经验 获得超6个赞
用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贡献1829条经验 获得超6个赞
你需要了解发生了什么:
当您从网站查询页面时,无论是使用Jsoup还是浏览器,返回给您的是一些HTML。Jsoup能够解析它。
但是,大多数网站都包含该HTML中的Javascript,或者从该HTML链接,该HTML将使用内容填充页面。您的浏览器能够执行Javascript,从而填充页面。Jsoup不是。
理解这一点的方法如下:解析HTML代码很容易。执行Javascript代码和更新相应的HTML代码要复杂得多,并且是浏览器的工作。
以下是针对此类问题的一些解决方案:
如果您可以找到Javascript代码正在进行的Ajax调用,即加载内容,您可以使用Jsoup使用这些调用的URL。为此,请使用浏览器中的Developer Tools。但这不能保证工作:
可能是url是动态的,并且取决于当时页面上的内容
如果内容不公开,将涉及cookie,而仅仅查询资源URL是不够的
在这些情况下,您需要“模拟”浏览器的工作。幸运的是,存在这样的工具。我知道并推荐的是PhantomJS。它适用于Javascript,您需要通过启动新进程从Java启动它。如果你想坚持Java,这篇文章列出了一些Java备选方案。
添加回答
举报