2013-05-01 48 views
3

我想解析一個包含一些JS的網頁。到目前爲止,我正在使用Jsoup來解析Java中的html,這正在按預期工作。但我無法解析JavaScript。下面是HTML的頁面級解析包含Java中的JS的HTML頁面

<script type="text/javascript"> 
var element = document.createElement("input"); 
element.setAttribute("type", "hidden"); 
element.setAttribute("value", ""); 
element.setAttribute("name", "AzPwXPs"); 
element.setAttribute("id", "AzPwXPs"); 
var foo = document.getElementById("dnipb"); 
foo.appendChild(element); 
var element1 = document.createElement("input"); 
element1.setAttribute("type", "hidden"); 
element1.setAttribute("value", "6D6AB8AECC9B28235F1DE39D879537E1"); 
element1.setAttribute("name", "ZLZWNK"); 
element1.setAttribute("id", "ZLZWNK"); 
foo.appendChild(element1); 
</script> 

我想與他們name/id讀取兩個值的片段。所以解析後我可以得到如下結果:

AzPwXPs= 
ZLZWNK=6D6AB8AECC9B28235F1DE39D879537E1 

如何解析這種情況?

+0

Jsoup只解析HTML。它無法解析或運行JS。 – nhahtdh 2013-05-01 10:47:33

+0

@nhahtdh:雅,我知道。這就是爲什麼我被困在... :(但必須有其他解決方法 – 2013-05-01 10:49:35

+0

運行它通過JS解析器?或者得到一個JS引擎?(其實我也有一個側面項目的同樣的問題,但我從來沒有讓我的手圍繞它...) – nhahtdh 2013-05-01 10:52:30

回答

1

硒的webdriver的是太棒了:http://docs.seleniumhq.org/docs/03_webdriver.jsp

爲你一個例子看到這個答案正試圖做: Using Selenium Web Driver to retrieve value of a HTML input

+0

jQuery的意思是使用?你能解釋我多一點嗎? – 2013-05-02 17:05:21

+0

javascript'return $('#AzPwXPs')[0]'使用jquery選擇器($('#AzPwXPs'))來找到元素 – 2013-05-02 17:27:29

+0

所以,最後在我的Java解析器項目中會有'Selenium的Webdriver'和'jquery'。是嗎? – 2013-05-02 18:24:45

1

您可以嘗試使用查詢庫。它更容易。

+1

你可以請他們推薦他們中的任何一個嗎?它是否可用Java? – 2013-05-02 17:06:03

1

我已經在相同的情況下在css文件中查找url。

把JavaScript爲字符串和應用正則表達式

Pattern p = Pattern.compile("url\\(\\s*(['" + '"' + "]?+)(.*?)\\1\\s*\\)"); //expression 
Matcher m = p.matcher(content); 
while (m.find()) { 
String urlFound = m.group(); 
} 

問候, 雨果佩德羅薩

+0

儘管我得到了邏輯,但是如何修改這個以滿足我的目的? – 2013-05-02 17:07:10

1

一旦你'已經從JSoup獲得了<script>元素的文本內容,您可以使用Caja JS parser解析JS,然後遍歷解析樹來找到您要查找的內容。

+0

How得到'

3

當我搜索用JavaScript解析頁面的解決方案時,我偶然發現了這個問題,但提供的解決方案並不完美。我通過使用JBrowserDriverJSoup來解析JavaScript操作頁面,發現了純Java解決方案。

簡單的例子:

// JBrowserDriver part 
    JBrowserDriver driver = new JBrowserDriver(Settings 
      .builder(). 
      timezone(Timezone.EUROPE_ATHENS).build()); 
    driver.get(FETCH_URL); 
    String loadedPage = driver.getPageSource(); 

    // JSoup parsing part 
    Document document = Jsoup.parse(loadedPage); 
    Elements elements = document.select("#nav-console span.data"); 

    log.info("Found element count: {}", elements.size()); 

    driver.quit();