Как я могу преобразовать JAVAFX Webv ie в синтаксический анализ JSOUP? - PullRequest
0 голосов
/ 19 марта 2020

Я хочу преобразовать веб-сайт, загруженный 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();
    }

Я получаю следующее сообщение об ошибке: Исключение в потоке "main" java .lang.ExceptionInInitializerError

Как происходит сбой?

ET C У меня есть пример отсюда:

Как проанализировать html из веб-просмотра javafx и перенести эти данные в документ Jsoup?

В этой строке ist .get неправильно: String html = новый org.jsoup.helper.W3CDom (). AsString (webEngine.get);

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Этим кодом я получаю сообщение об ошибке:

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 (собственный метод) по адресу java .base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl. java: 62) по адресу java .base / jdk. . java: 43) в java .base / java .lang.reflect.Method.invoke (Метод. 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.NativeMetmplAccess (Собственный метод) в java .base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl. java: 62) в java .base / jdk.internal.reflect.DelegatingMethodAccessorImpain. tingMethodAccessorImpl. 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 (поток. java: 830) Причина: java .lang.IllegalAccessError: ошибка проверки доступа суперкласса: класс com.sun.javafx.sg.prism.web.NGWebView (в неназванном модуле @ 0x5c50615 c) не может получить доступ к классу 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 (ClassLoa der. 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.lolassLoaderCuilin. 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$Run(Plat java: 455) на javafx.graphics/com.sun.javafx.application.PlatformImp l.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._runL oop (собственный метод) по адресу javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... еще 1 Приложение-исключение для запуска приложения. Главное

0 голосов
/ 20 марта 2020

Этот дубликат , вероятно, является лучшим выбором. После загрузки страницы в WebView используйте Transformer, чтобы получить ее HTML. Затем используйте эту строку HTML в Jsoup. Я не уверен, что вы получите ожидаемый результат.

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);
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...