我正在尝试解析某些文档站点的侧边栏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? 谢谢您的建议。
答案 0 :(得分:1)
我不能保证这是最好的方法,因为我以前从未使用过Jsoup,而且我也不是XML API的专家。
org.jsoup.Jsoup
类具有一种以String
形式解析HTML的方法:Jsoup.parse(String)
。这意味着我们需要从WebView
获取HTML作为String
。 WebEngine
类具有一个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
打印到控制台上,使所有似乎正常运行,进行了一些“测试”。
但是有一个警告:据我了解,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);