問題背景
的REV-文本元素不是「默認」頁源的一部分,它是用JavaScript動態加載。由於Jsoup不是瀏覽器模擬器,它不會在它剛剛爲您提供源代碼的頁面上執行腳本。
測試檢索源的簡單方法是將其打印出來;你會發現rev-text類完全不存在。
System.out.println(doc.html()); //print out page source
建議的解決方案
一般刮從網頁是JavaScript的沉重它通常是非常有用使用一個工具,可以通過網頁上執行腳本模擬瀏覽器的內容。一個共同的庫是這樣做的Selenium。您可以使用selenium中的PhantomJS(您可以在此讀取)驅動程序,獲取頁面,將頁面源傳遞給Jsoup並提取rev文本。
下面是一個使用硒提取所需的字段一個示例代碼:
public static void main(String[] args) throws IOException, InterruptedException {
WebDriver driver = new PhantomJSDriver(new DesiredCapabilities());
driver.get("https://www.zomato.com/ahmedabad/mcdonalds-navrangpura"); //retrieve page with selenium
Thread.sleep(3*1000); //bad idea, wait for specific element. e.g rev-text class instead of using sleep[1].
Document doc = Jsoup.parse(driver.getPageSource());
driver.quit(); //quit webdriver
// get page title
String title = doc.title();
System.out.println("title : " + title);
// get all links with rev-text class
Elements links = doc.getElementsByClass("rev-text");
for (Element link : links) {
// get the value from href attribute
System.out.println("\nlink : " + link);
System.out.println("text : " + link.text());
}
}
}
您需要的硒庫添加到您的類路徑。我正在使用maven,所以我添加的是:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.45.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>2.45.0</version>
</dependency>
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>phantomjsdriver</artifactId>
<version>1.2.1</version>
</dependency>
這適用於我,並在頁面中提取評論。
- Wait for specific element in selenium
同比正在試圖讓 – vab
這是因爲該網站加載的JavaScript評論此頁面上的評論,和jsoup不支持javascript。您可以通過在瀏覽器中禁用JS並加載該頁面來測試它 - 它不起作用。解決此問題的方法是手動加載來自url的數據 - 它是「https:// www.zomato.com/php/filter_reviews.php」,您將不得不保存獲得的html第一頁,並將您的請求發送到此網址以獲取評論數據。 – JonasCz