2015-10-08 28 views
0

在某些類我是新來jsoup並試圖從以下鏈接抽取數據,無法擷取來自jsoup API

https://www.zomato.com/ahmedabad/mcdonalds-navrangpura

,但我沒能得到數據,下面的類:轉文本

這是我的代碼:

public class Test { 

    public static void main(String[] args) throws IOException { 
     Document doc; 
     doc = Jsoup.connect("https://www.zomato.com/ahmedabad/mcdonalds-navrangpura").userAgent("Chrome/41.0.2228.0").get(); 

     // get page title 
     String title = doc.title(); 
     System.out.println("title : " + title); 

     // get all links 
     Elements links = doc.getElementsByClass("rev-text"); 

    /* Elements links = doc.getAllElements();*/ 
     for (Element link : links) { 

      // get the value from href attribute 
      System.out.println("\nlink : " + link); 
      System.out.println("text : " + link.text()); 

     } 
} 
} 

請指導我如何做到這一點。

+0

同比正在試圖讓 – vab

+0

這是因爲該網站加載的JavaScript評論此頁面上的評論,和jsoup不支持javascript。您可以通過在瀏覽器中禁用JS並加載該頁面來測試它 - 它不起作用。解決此問題的方法是手動加載來自url的數據 - 它是「https:// www.zomato.com/php/filter_reviews.php」,您將不得不保存獲得的html第一頁,並將您的請求發送到此網址以獲取評論數據。 – JonasCz

回答

0

問題背景

的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> 

這適用於我,並在頁面中提取評論。

  1. Wait for specific element in selenium