使用dom上下文在Java JVM中执行JS

问题描述 投票:0回答:2

我目前正在做我的小项目,遇到小(或大)困难。

我正在编写一个Java程序,该程序在网站摘录中运行并运行一些JavaScript代码。我正在使用ScriptEngineManager在JVM中运行JavaSript代码,但由于无法访问dom上下文,某些代码如document.getInnerHtml().getElementById()无法正常工作。

我可以通过任何方式运行它吗?

javascript java html ajax dom
2个回答
0
投票

那么,

我希望您发现此答案“有所帮助”。我之所以说“有点”,主要是因为由于我还没有通过Selenium WebDriver库工作,因此我无法对您的困境提供完整的答案。我亲自编写了一个相当大的HTML解析器,用于搜索和抓取HTML页面。 Java库(Sun Micro-Systems的Java发行版中包含的库)的实际情况是不包含“ Java脚本执行库”。实际上,“ ScriptEngineManager”是我从未使用过的软件包。我的辩护是,Java框架中有许多我没有编码的额外库。

然而,重要的是,我在解析,搜索和将HTML,CSS,Java脚本,AJAX抓取到Java库中进行了大量工作。您可以在这里查看它,并且它的目标类似于名为“ JSoup”的项目-已经存在了很长时间,但是缺少我的某些功能。 (JSoup Scrape链接:JSoup.org和Torello.HTML:developer.torello.directory

我可以提供的帮助是,您需要考虑项目的目标(问题并不能很好地阐明它!),以便确定您要使用哪些其他库。

[如果您想真正开始执行JavaScript(除非绝对必要,否则我不建议这样做),您需要查看“ Selenium Web Driver Libraries”。该库要复杂一个数量级,通常,如果您只是想从网站上获取一些数据,则可以使用简单的抓取包,也可以使用混合方法,在其中进行Java调用并进行“模拟” “对Web服务器的AJAX和JSON调用是正确的主意。通常,从SO上看到的Selenium人群通常对自动发布和与WebSite交互更感兴趣,这是使用Selenium Java-Script执行库所必需的。

如果您只想访问静态内容,则可以尝试以下代码。我将使用Torello.HTML发布它,但是显然您也可以使用JSOUP库。如果您只是对获取HTML和Content本身感兴趣,并且愿意编写Java代码以执行Java中的目标-省略Java脚本-那么就可以了。同样,如果您尝试运行与Web服务器交互的重复查询,并且绝对必须在该页面上使用Java脚本,请重新发布您的问题并尝试询问有关使用Selenium Web驱动程序的问题。

import Torello.HTML.*;
import Torello.HTML.NodeSearch.*;
import Torello.Java.FileRW;

import java.util.*;
import java.io.*;

public class Scrape
{
    public static void main(String[] argv) throws IOException
    {
        String              html        = FileRW.loadFileToString("Example.html");
        Vector<HTMLNode>    page        = HTMLPage.getPageTokens(html, false);
        Vector<HTMLNode>    divContent  = InnerTagGetInclusive.first
                                        (page, "div", "id", TextComparitor.EQ_CI_TRM, "k");
        System.out.println(
                "Entire <DIV ...> Element:\n" + 
                Util.pageToString(divContent) + "\n\n" +
                "DIV Element Contents:\n" + 
                Util.textNodesString(divContent));
    }
}

这是上面(简短的)Java类HTML搜索和刮擦示例生成的输出:

Entire <DIV ...> Element:
<div style="display:none;visibility:hidden;" id="k">+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]))</div>

DIV Element Contents:
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]))

0
投票

所以,这是一个例子

 <!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8" />

    <script type="text/javascript">
  
      var a = document.getElementById('k');
     
</script>


</head>
<body>
  <div style="display:none;visibility:hidden;" id="k">+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]))</div>
  


</body>
</html>

因此,我的Java程序将尝试运行该“ document.getElementById('k')”代码,但他不会看到HTML div在哪里,因此将引发未定义的文档。

因此,在Java中是ScriptEngineManager,它可以让您评估Javascript代码,但它无法访问html文档,因此不适用于此类代码。

© www.soinside.com 2019 - 2024. All rights reserved.