Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在(任何)Java程序中呈现JavaScript和HTML(访问呈现的DOM树)?_Java_Javascript_Rendering - Fatal编程技术网

在(任何)Java程序中呈现JavaScript和HTML(访问呈现的DOM树)?

在(任何)Java程序中呈现JavaScript和HTML(访问呈现的DOM树)?,java,javascript,rendering,Java,Javascript,Rendering,什么是最好的Java库“完全下载任何网页并呈现内置JavaScript,然后以编程方式访问呈现的网页(即DOM树!),并将DOM树作为“HTML源” (与firebug最终所做的类似,它呈现页面,我可以访问完全呈现的DOM树,就像浏览器中的页面一样!相反,如果我单击“显示源代码”,我只能获得JavaScript源代码。这不是我想要的。我需要访问呈现页面…) (对于渲染,我的意思是只渲染DOM树而不是视觉渲染…) 这不一定是一个单一的库,可以有几个库一起完成(一个将下载,一个呈现…),但由于Jav

什么是最好的Java库“完全下载任何网页并呈现内置JavaScript,然后以编程方式访问呈现的网页(即DOM树!),并将DOM树作为“HTML源”

(与firebug最终所做的类似,它呈现页面,我可以访问完全呈现的DOM树,就像浏览器中的页面一样!相反,如果我单击“显示源代码”,我只能获得JavaScript源代码。这不是我想要的。我需要访问呈现页面…)

(对于渲染,我的意思是只渲染DOM树而不是视觉渲染…)

这不一定是一个单一的库,可以有几个库一起完成(一个将下载,一个呈现…),但由于JavaScript的动态特性,JavaScript库很可能还必须有某种下载程序来完全呈现任何异步JS

背景:
在“美好的过去”,HttpClient(Apache库)是构建您自己的非常简单的爬虫程序所需的一切。(许多Cralwer,如Nutch或Heretrix,仍然围绕这个核心原则构建,主要关注标准HTML解析,因此我无法从中学习) 我的问题是,我需要抓取一些严重依赖JavaScript的网站,而我无法使用HttpClient解析这些网站,因为我需要在MozSwing提供帮助之前执行JavaScripts。

您可以试试JExplorer。 有关更多信息,请参阅


您也可以尝试Cobra,请参见

这有点不合时宜,但如果您计划在完全控制环境的服务器上运行代码,它可能会起作用

在你的机器上安装Firefox(或者XulRunner,如果你想保持轻量级的话)

使用Firefox插件系统,编写一个小插件,加载给定的URL,等待几秒钟,然后将页面的DOM复制到字符串中

在这个插件中,使用JavaLiveConnect API(请参阅和)将该字符串推送到某个嵌入Java代码中的公共静态函数中,该函数可以自己执行所需的处理,也可以将其分配到更复杂的代码中

优点:您使用的浏览器是大多数应用程序开发人员的目标浏览器,因此观察到的行为应具有可比性。您还可以按照正常的升级路径升级浏览器,这样您的库不会随着HTML标准的更改而过时

缺点:您需要有在服务器上启动无头应用程序的权限。您还需要担心进程间通信的复杂性

我以前使用过插件API调用Java,这是可以实现的。如果你想要一些示例代码,你应该看看XQuery插件-它从DOM加载XQuery代码,将其传递到Java Saxon库进行处理,然后将结果推回到浏览器中。这里有一些详细信息:

该库通常用于测试,但它确实为您提供了对大多数标准浏览器(如Firefox等)的远程控制,以及无头、无浏览器模式(使用HtmlUnit)。因为它旨在通过页面抓取进行UI验证,所以它很可能满足您的目的

根据我的经验,它有时会遇到速度非常慢的JavaScript,但仔细使用“wait”命令可以得到非常可靠的结果

它还有一个好处,即您可以实际驱动页面,而不仅仅是刮取页面。这意味着,如果您在获取所需数据之前在页面上执行某些操作(单击搜索按钮,单击下一步,现在刮取),那么您可以将其编码到流程中


我不知道您是否能够从Selenium以可导航的形式获得完整的DOM,但它确实为页面的各个部分提供了XPath检索,这是刮片应用程序通常需要的。

您可以使用Java、Groovy和Grails,也可以不使用Grails。然后使用Webdriver、Selenium、Spock和Geb这些都是用于测试purpos的是的,但是这些库对您的案例很有用。 您可以实现一个爬虫程序,它不会打开一个新窗口,而只是这些浏览器的一个运行时

  • 硒:
  • 网络驱动程序:
  • 斯波克:
  • Geb:

我还没有尝试过这个项目,但我已经看到了node.js的几个实现,其中包括javascript dom操作


您可以使用JavaFX2
WebEngine
。下载(如果您安装了JDK7u2或更高版本,您可能已经拥有了它),然后尝试下面的代码

它将使用经过处理的javascript打印html。 可以在中间取消注释行,也可以看到呈现。

public class WebLauncher extends Application {

    @Override
    public void start(Stage stage) {
        final WebView webView = new WebView();
        final WebEngine webEngine = webView.getEngine();
        webEngine.load("http://stackoverflow.com");
        //stage.setScene(new Scene(webView));
        //stage.show();

        webEngine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                if (newValue.intValue() == 100 /*percents*/) {
                    try {
                        org.w3c.dom.Document doc = webEngine.getDocument();
                        new XMLSerializer(System.out, new OutputFormat(doc, "UTF-8", true)).serialize(doc);
                    } catch (IOException ex) { 
                        ex.printStackTrace();
                    }
                }
            }
        });

    }

    public static void main(String[] args) {
        launch();
    }

}
公共类WebLauncher扩展应用程序{
@凌驾
公众假期开始(阶段){
最终WebView WebView=新WebView();
final-WebEngine-WebEngine=webView.getEngine();
webEngine.load(“http://stackoverflow.com");
//舞台场景(新场景(网络视图));
//stage.show();
webEngine.getLoadWorker().workDoneProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevalue)当您说“呈现任何异步js”时,您的意思是库需要具有“刮取”功能吗"页面进行的任何异步调用?这将非常困难,因为您基本上是在尝试捕获动态页面的内容,该页面在初始请求完成后更新,有时在用户触发事件之前,数据不会异步拉入。+1-这方面的解决方案已经启动过一次,但不幸的是,开发在2008年停滞了,很明显-enter:它的目的是允许运行针对DOM的javascript scraper来自动化网站抓取,但避免了所有语法规范化问题。-即使是a,但Ben的结论和更新是高的