用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 正在被使用是什么意思?你能解释一下吗? javascriptreturn $('#AzPwXPs')[0]
使用 jquery 选择器 ($('#AzPwXPs')) 来查找元素。
所以,最后在我的 java 解析器项目中将有 Selenium's Webdriver
和 jquery
。是吗?
不,您不需要使用 jquery - 我只是要链接到一个向您展示更好示例的答案【参考方案4】:
从 JSoup 获得 <script>
元素的文本内容后,您可以使用 Caja JS parser 解析 JS,然后遍历解析树以找到您要查找的内容。
【讨论】:
如何从JSoup中获取<script>
元素?
@Ravi,如果您正在执行类似Document doc = Jsoup.parse(...)
的操作,那么doc.getElementsByTag("script").first()
应该会为您提供页面中的第一个脚本。【参考方案5】:
您可以尝试使用查询库。使用它更容易。
【讨论】:
你能推荐其中任何一个吗?它在 Java 中可用吗?以上是关于用Java解析包含JS的HTML页面的主要内容,如果未能解决你的问题,请参考以下文章