从 Java 检索网页上动态呈现的 SVG
Posted
技术标签:
【中文标题】从 Java 检索网页上动态呈现的 SVG【英文标题】:Retrieve an SVG dynamically rendered on a web page from Java 【发布时间】:2017-03-15 03:59:38 【问题描述】:有没有办法让我从 Java 中的 javascript 呈现的 html 页面中呈现和解析 SVG 元素, 例如:http://bl.ocks.org/mbostock/raw/4063269/,在这种情况下使用 d3.js。
【问题讨论】:
补充一下,我试过HtmlUnit、jsoup,甚至在SWT中调查过,但无济于事。这就是为什么这个问题有点宽泛,因为我不想将解决方案限制在一个工具上。 ***.com/questions/26027313/… 可能重复? @definecindyconst 这不是[***.com/questions/26027313/…的复制品,解析SVG很简单。 我不确定你在这里期待什么,这个问题很不清楚。你需要一些东西来渲染 SVG(你说 JavaScript,所以你期望有一个完整的 JS VM 吗?)并显示它。你希望它如何显示? Swing 还是 JavaFX?你能简单地使用WebView吗? 你能用一些例子详细说明你的问题吗? 【参考方案1】:如果我正确理解了您的问题,您的问题是您使用的工具 (HtmlUnit) 无法处理复杂的 JS (d3.js)。
在这种情况下,没有什么比使用真正的浏览器更好的了。您可以使用Selenium 使用远程控制的浏览器实例打开您的页面,并从那里获取 JS 呈现的 html。
This tutorial 包含几乎所有你需要的东西。除了 getting html 部分,你可以在this SO answer中找到它。
之后,您可以将 html 提供给您想要的任何解析器。
编辑
刚刚想到另一种方式,可以试试WebKit Html2Pdf。它的目的是创建 PDF 文件,但它在后台使用 WebKit,您可以注入自定义脚本(如 document.onload 回调),该脚本将在页面加载后将 SVG 内容发布到您的服务。
但我不会走那条路,它有很多限制(基本上只适用于直接网址)并且总体上很混乱。
【讨论】:
您确实正确理解了这个问题,htmlunit 本身没有 javascript 引擎。但是,我想有一个“纯”的 java 方式,不知道 Rhino 或 Nashborn 是否可以处理这个。 在这种情况下,你应该展示你的实际情况,因为有很多选择,据我所知,它们都不是理想的,所以没有人可以肯定地告诉你它们会起作用给你。【参考方案2】:如果您想要将 SVG 内容作为String
获取,Selenium 是您的最佳选择,就像@chimmi 所说的那样。但是,您可以改用PhantomJS,而无需打开真正的浏览器窗口。
理论上,它应该是这样工作的:
System.setProperty("phantomjs.binary.path", "/path/to/phantomjs");
WebDriver driver = new PhantomJSDriver();
// Open your page with SVG
driver.get("http://localhost:8080/svgpage");
// Find the SVG
WebElement svg = driver.findElement(By.tageName("svg"));
// Get its XML content
String xml = svg.getAttribute("outerHTML");
如果您想在非网络应用程序的屏幕上实际呈现 SVG,则可以从这里使用 Batik。
或者,如果您只想对 SVG 内容进行断言以进行测试,请记住您可以使用普通的 CSS 或 XPath 选择器选择子元素:
//Select all <path> elements within the SVG
Lis<WebElement> pathElementsInSVG = svg.findElements(By.tagName("path"));
//Assert there is 4 <path>s
assert pathElementsInSVG.size() == 4
【讨论】:
以上是关于从 Java 检索网页上动态呈现的 SVG的主要内容,如果未能解决你的问题,请参考以下文章