用Java解析包含JS的HTML页面

Posted

技术标签:

【中文标题】用Java解析包含JS的HTML页面【英文标题】:Parsing HTML page containing JS in Java 【发布时间】:2013-04-25 08:45:32 【问题描述】:

我正在尝试解析包含一些 JS 的网页。到目前为止,我正在使用 Jsoup 来解析 Java 中的 html,它按预期工作。但我无法解析 javascript。下面是HTML页面的sn-p-

<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

这种情况如何解析?

【问题讨论】:

Jsoup 只解析 HTML。它无法解析或运行 JS。 @nhahtdh:是的,我知道。这就是为什么我被困在两者之间...... :(但必须有其他方法 通过 JS 解析器运行它?还是弄个JS引擎? (实际上我在一个业余项目中也遇到了同样的问题,但我从来没有解决过它......) 【参考方案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(); 

问候, 雨果·佩德罗萨

【讨论】:

虽然我得到了逻辑,但是如何修改它来达到我的目的?【参考方案2】:

在搜索使用 JavaScript 解析页面的解决方案时,我曾多次偶然发现这个问题,但提供的解决方案并不完美。我通过使用JBrowserDriver 和JSoup 来解析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();

【讨论】:

完美运行【参考方案3】:

Selenium 的 Webdriver 很棒:http://docs.seleniumhq.org/docs/03_webdriver.jsp

有关您尝试执行的操作的示例,请参见此答案: Using Selenium Web Driver to retrieve value of a HTML input

【讨论】:

你说的 jQuery 正在被使用是什么意思?你能解释一下吗? javascript return $('#AzPwXPs')[0] 使用 jquery 选择器 ($('#AzPwXPs')) 来查找元素。 所以,最后在我的 java 解析器项目中将有 Selenium's Webdriverjquery。是吗? 不,您不需要使用 jquery - 我只是要链接到一个向您展示更好示例的答案【参考方案4】:

从 JSoup 获得 &lt;script&gt; 元素的文本内容后,您可以使用 Caja JS parser 解析 JS,然后遍历解析树以找到您要查找的内容。

【讨论】:

如何从JSoup中获取&lt;script&gt;元素? @Ravi,如果您正在执行类似Document doc = Jsoup.parse(...) 的操作,那么doc.getElementsByTag("script").first() 应该会为您提供页面中的第一个脚本。【参考方案5】:

您可以尝试使用查询库。使用它更容易。

【讨论】:

你能推荐其中任何一个吗?它在 Java 中可用吗?

以上是关于用Java解析包含JS的HTML页面的主要内容,如果未能解决你的问题,请参考以下文章

页面的重绘与回流及优化

pdfobject.js中怎么在新页面预览pdf文件

用JS实时调用数据显示在HTML页面上

在html页面的js中怎么获取Java中返回的map集合

在html页面中如何用js调用java类

用node.js对一个英语句子分析页面进行一个小爬虫