如何从javafx webview解析html并将此数据传输到Jsoup Document?

时间:2018-09-17 09:18:07

标签: html javafx jsoup

我正在尝试解析某些文档站点的侧边栏TOC(组件表)。

Jsoup

我尝试过Jsoup。我无法获得TOC元素,因为此标记中的HTML内容不是初始HTML的一部分,而是在页面加载后由JavaScript设置的。

您可以在这里看到我之前的问题:JSoup cannot parse child elements after depth 2

建议的解决方案是从“浏览器开发工具”菜单中检查手动建立的连接,以找到网站的最新版本。某些文档站点的侧边栏TOC解析只是我的Java程序的一个组件,因此我无法手动执行。

JavaFX Webview(不是Android Webview)

我尝试使用JavaFX Webview是因为我需要一个能够执行javascript代码并填充Toc标记组件的浏览器。

WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
webEngine.load("https://docs.microsoft.com/en-us/ef/ef6/");

但是我不知道如何检索已加载网站的HTML代码并将此数据传输到Jsoup Document? 谢谢您的建议。

2 个答案:

答案 0 :(得分:1)

我不能保证这是最好的方法,因为我以前从未使用过Jsoup,而且我也不是XML API的专家。

org.jsoup.Jsoup类具有一种以String形式解析HTML的方法:Jsoup.parse(String)。这意味着我们需要从WebView获取HTML作为StringWebEngine类具有一个document property,其中包含一个org.w3c.dom.DocumentDocument是当前显示的网页的HTML内容。我们只需要将此Document转换为String,就可以使用Transformer来完成。

import java.io.StringWriter;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.jsoup.Jsoup;

public class Utils {

  private static Transformer transformer;

  // not thread safe
  public static org.jsoup.nodes.Document convert(org.w3c.dom.Document doc)
      throws TransformerException {
    if (transformer == null) {
      transformer = TransformerFactory.newDefaultInstance().newTransformer();
    }

    StringWriter writer = new StringWriter();
    transformer.transform(new DOMSource(doc), new StreamResult(writer));
    return Jsoup.parse(writer.toString());
  }

}

每次document属性更改时,您都将调用此方法。我通过浏览Google并将org.jsoup.nodes.Document打印到控制台上,使所有似乎正常运行,进行了一些“测试”。

但是有一个警告:据我了解,document属性不会在同一网页中发生更改时更改(Document本身 可能会更新)。我不是网络人士,所以请原谅我,如果我在这里没有道理,但是我相信这包括诸如更改其内容的框架之类的事情。通过使用WebEngine.executeStript(String)与JavaScript进行交互可能有解决此问题的方法,但是我不知道怎么做。

答案 1 :(得分:1)

    WebView browser = new WebView();
    WebEngine webEngine = browser.getEngine();
    String url = "https://docs.microsoft.com/en-us/ef/ef6/";
    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 html =  new org.jsoup.helper.W3CDom().asString(webEngine.get);
    // create jsoup document by parsing html
    Document doc = Jsoup.parse(url, html);