【问题标题】:How can i convert a JAVAFX Webvie to Parsing JSOUP?如何将 JAVAFX Webvie 转换为 Parsing JSOUP?
【发布时间】:2020-07-01 00:41:58
【问题描述】:

我想将 javaFX 加载的网站转换为 JSOUP。 p

ublic class database {
    public static ArrayList<String> database = new ArrayList<String>();

    public static ArrayList<Integer> laenge = new ArrayList<Integer>(); 
    public static ArrayList<Integer> tiefe = new ArrayList<Integer>(); 
    public static void main(String[] args) throws IOException, JSONException {
        // TODO Auto-generated method stub


         WebView browser = new WebView();
            WebEngine webEngine = browser.getEngine();
            String url = "http://www.google.com";
            webEngine.load(url);
            //get w3c document from webEngine
            org.w3c.dom.Document w3cDocument = webEngine.getDocument();
            // use jsoup helper methods to convert it to string
            String htm =  new org.jsoup.helper.W3CDom().asString(webEngine.getDocument());
            // create jsoup document by parsing html
            Document doc = Jsoup.parse(url, htm);




        //Document doc = Jsoup.connect("http://ttp-schreiber.de/Mathematik/index2.html").get();
        Element title = doc.body();
        /*WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();
        webEngine.load("http://ttp-schreiber.de/Mathematik/index2.html");
        */
        Elements html = doc.select("html");
        Controller(html);
    //  System.out.println("+--+"+deeper(next(html,html.last()))[0][0]);

        databasesafe();
    }

我收到以下错误消息: 线程“主”java.lang.ExceptionInInitializerError 中的异常

怎么弄错了?

ETC 我这里有例子:

How to parse html from javafx webview and transfer this data to Jsoup Document?

在这行中 ist .get 错误:String html = new org.jsoup.helper.W3CDom().asString(webEngine.get);

【问题讨论】:

标签: javafx


【解决方案1】:

通过这些代码我得到一个错误:

package application;

import java.io.IOException;

import org.jsoup.Jsoup;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;


public class Main extends Application {
    org.jsoup.nodes.Document jsoupDocument;
    @Override
    public void start(Stage primaryStage) {
           String url = "http://www.google.com";

            WebView browser = new WebView();
            WebEngine webEngine = browser.getEngine();
            webEngine.load(url);
            webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) ->
            {
                switch(newValue)
                {
                    case SUCCEEDED:                    
                        try
                        {
                            jsoupDocument = Jsoup.connect(webEngine.getLocation()).get();
                            System.out.println("JSoup Output:");
                            System.out.println(jsoupDocument.toString());
                        }
                        catch (IOException ex)
                        {
                            ex.printStackTrace();
                        }

                        break;
                    case FAILED:
                        break;
                }
            });
            StackPane root = new StackPane(browser);
            primaryStage.setTitle("Hello Drag And Drop");
            Scene scene = new Scene(root, 400, 200);
            primaryStage.setScene(scene);
            primaryStage.show();
        }



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

错误信息: 应用程序启动方法中的异常 java.lang.reflect.InvocationTargetException 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:567) 在 javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) 在 javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:567) 在 java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) 原因:java.lang.RuntimeException:应用程序启动方法中的异常 在 javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) 在 javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) 在 java.base/java.lang.Thread.run(Thread.java:830) 原因:java.lang.IllegalAccessError:超类访问检查失败:com.sun.javafx.sg.prism.web.NGWebView 类(在未命名模块@0x5c50615c 中)无法访问com.sun.javafx.sg.prism.NGGroup 类(在模块 javafx.graphics 中),因为模块 javafx.graphics 不会将 com.sun.javafx.sg.prism 导出到未命名的模块 @0x5c50615c 在 java.base/java.lang.ClassLoader.defineClass1(本机方法) 在 java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) 在 application.Main.start(Main.java:24) 在 javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) 在 javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) 在 javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:391) 在 javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) 在 javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) 在 javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(本机方法) 在 javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... 1 更多 异常运行应用程序application.Main

【讨论】:

    【解决方案2】:

    This duplicate 可能是您最好的选择。在WebView 中加载页面后,使用Transformer 获取其HTML。然后在Jsoup 中使用该HTML 字符串。我不确定你是否会得到预期的结果。

    import java.io.File;
    import java.nio.file.Files;
    import javafx.application.Application;
    import javafx.concurrent.Worker;
    import javafx.scene.Scene;
    import javafx.scene.layout.StackPane;
    import javafx.scene.web.WebEngine;
    import javafx.scene.web.WebView;
    import javafx.stage.Stage;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.jsoup.Jsoup;
    import org.w3c.dom.Document;
    //import org.jsoup.nodes.Document;
    
    
    public class App extends Application
    {
        org.jsoup.nodes.Document jsoupDocument;
    
        @Override
        public void start(Stage stage)
        {
            String url = "http://www.google.com";
    
            WebView webview = new WebView();
        final WebEngine webengine = webview.getEngine();
        webengine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) ->
            {
                if (newState == Worker.State.SUCCEEDED) {
                    Document doc = webengine.getDocument();
                    try {
                        Transformer transformer = TransformerFactory.newInstance().newTransformer();
                        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
                        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
                        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
                        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    
                        File file = new File("results.txt");
                        file.createNewFile();
                        StreamResult results = new StreamResult(file);
                        transformer.transform(new DOMSource(doc), results);
    
                        String fileContent = Files.readString(file.toPath());
                        jsoupDocument = Jsoup.parse(fileContent);
                        System.out.println(jsoupDocument.toString());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
        webengine.load("http://stackoverflow.com");
    
    
            StackPane root = new StackPane(webview);
            stage.setTitle("Hello Drag And Drop");
            Scene scene = new Scene(root, 400, 200);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args)
        {
            Application.launch(args);
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2013-07-22
      • 2016-11-21
      • 1970-01-01
      • 2021-09-24
      • 2016-07-04
      • 2014-04-07
      相关资源
      最近更新 更多