2016-07-25 65 views
1

我對Java的html解析很新,我以前用JSoup解析簡單的html而沒有它動態改變,但是我現在需要解析一個有動態元素的網頁。這是我嘗試用先前解析網頁的代碼,但無法找到元素,因爲它們是在頁面加載後添加的。情況是問題是使用帶有標記的谷歌地圖的頁面,我試圖颳去這些標記的圖像。Java解析html元素生成的JS

public static void main(String[] args) { 
try { 
    doc = Jsoup.connect("https://pokevision.com") 
      .userAgent(
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36") 
      .get(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
Elements images = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]"); 

for (Element image : images) { 
    System.out.println("src : " + image.attr("src")); 
} 

} 

因爲顯然這個操作在JSoup中是不可能的,所以我可以使用其他庫來查找圖像源。 Example of an element I am attempting to select

+1

請參見[你不能用正則表達式解析HTML](/問題/ 1732348 /正則表達式匹配開放標籤,除了-XHTML-自足標籤) – Tibrogargan

+0

@Tibrogargan這是一個CSS選擇器由Jsoup支持:https://jsoup.org/cookbook/extracting-data/selector-syntax –

回答

0

您面臨的問題是Jsoup檢索靜態源代碼,因爲它將傳遞給瀏覽器。你想要的是在調用了javaScript之後的DOM。爲此,您可以使用HTML Unit獲取呈現的頁面,然後將其內容傳遞到Jsoup進行分析。

// capture rendered page 
WebClient webClient = new WebClient(); 
HtmlPage myPage = webClient.getPage("https://pokevision.com"); 

// convert to jsoup dom 
Document doc = Jsoup.parse(myPage.asXml()); 

// extract data using jsoup selectors 
Elements images = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]"); 
for (Element image : images) { 
    System.out.println("src : " + image.attr("src")); 
} 

// clean up resources 
webClient.close();