2013-05-01 56 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();