如何从 javafx webview 解析 html 并将此数据传输到 Jsoup 文档?
How to parse html from javafx webview and transfer this data to Jsoup Document?
我正在尝试解析某些文档站点的侧边栏目录(Table 组件)。
Jsoup
我试过Jsoup。我无法获取 TOC 元素,因为此标记中的 HTML 内容不是初始 HTML 的一部分,而是在页面加载后由 JavaScript 设置。
你可以在这里看到我之前的问题:JSoup cannot parse child elements after depth 2
建议的解决方案是检查哪些连接是通过浏览器开发工具菜单手动建立的,找到网站的最新版本。解析某些文档站点的边栏 TOC 只是我的 java 程序的一个组成部分,所以我无法手动执行此操作。
JavaFX Webview(不是 Android Webview)
我尝试过 JavaFX Webview,因为我需要一个可以执行 java 脚本代码并填充 Toc 标签组件的浏览器。
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
webEngine.load("https://docs.microsoft.com/en-us/ef/ef6/");
但我不知道如何检索已加载网站的 HTML 代码并将此数据传输到 Jsoup 文档?
任何建议表示赞赏。
我不能保证这是最好的方法,因为我以前没有使用过 Jsoup,而且我不是 XML API.
方面的专家
org.jsoup.Jsoup
class 有一个解析 String
形式的 HTML 的方法:Jsoup.parse(String)
. This means we need to get the HTML from the WebView
as a String
. The WebEngine
class has a document
property 包含一个 org.w3c.dom.Document
。此 Document
是当前显示网页的 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
打印到控制台做了一些 "tests",一切 似乎 都在工作。
不过有一个警告;据我了解,当同一网页内发生更改时,document
属性 不会更改(Document
本身 可能 会更新, 然而)。我不是网络人,所以如果我在这里没有意义,请原谅我,但我相信这包括框架改变其内容之类的事情。通过使用 WebEngine.executeStript(String)
与 JavaScript 接口可能有解决此问题的方法,但我不知道如何。
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);
我正在尝试解析某些文档站点的侧边栏目录(Table 组件)。
Jsoup
我试过Jsoup。我无法获取 TOC 元素,因为此标记中的 HTML 内容不是初始 HTML 的一部分,而是在页面加载后由 JavaScript 设置。
你可以在这里看到我之前的问题:JSoup cannot parse child elements after depth 2
建议的解决方案是检查哪些连接是通过浏览器开发工具菜单手动建立的,找到网站的最新版本。解析某些文档站点的边栏 TOC 只是我的 java 程序的一个组成部分,所以我无法手动执行此操作。
JavaFX Webview(不是 Android Webview)
我尝试过 JavaFX Webview,因为我需要一个可以执行 java 脚本代码并填充 Toc 标签组件的浏览器。
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
webEngine.load("https://docs.microsoft.com/en-us/ef/ef6/");
但我不知道如何检索已加载网站的 HTML 代码并将此数据传输到 Jsoup 文档? 任何建议表示赞赏。
我不能保证这是最好的方法,因为我以前没有使用过 Jsoup,而且我不是 XML API.
方面的专家 org.jsoup.Jsoup
class 有一个解析 String
形式的 HTML 的方法:Jsoup.parse(String)
. This means we need to get the HTML from the WebView
as a String
. The WebEngine
class has a document
property 包含一个 org.w3c.dom.Document
。此 Document
是当前显示网页的 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
打印到控制台做了一些 "tests",一切 似乎 都在工作。
不过有一个警告;据我了解,当同一网页内发生更改时,document
属性 不会更改(Document
本身 可能 会更新, 然而)。我不是网络人,所以如果我在这里没有意义,请原谅我,但我相信这包括框架改变其内容之类的事情。通过使用 WebEngine.executeStript(String)
与 JavaScript 接口可能有解决此问题的方法,但我不知道如何。
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);