HtmlUnit - 将 HtmlPage 转换为 HTML 字符串?
Posted
技术标签:
【中文标题】HtmlUnit - 将 HtmlPage 转换为 HTML 字符串?【英文标题】:HtmlUnit - Convert an HtmlPage into HTML string? 【发布时间】:2011-09-23 17:46:00 【问题描述】:我正在使用 htmlUnit 为各种页面生成 HTML,但现在,我能将页面转换为服务器返回的原始 HTML 的最佳方法是将 HtmlPage 转换为 XML 字符串。
这有点烦人,因为 Web 浏览器呈现 XML 输出的方式与原始 HTML 不同。有没有办法将 HtmlPage 转换为原始 HTML 而不是 XML?
谢谢!
【问题讨论】:
【参考方案1】:page.asXml()
将返回 HTML。 page.asText()
将其还原为纯文本。
【讨论】:
只是想确认一下这只返回文本节点内的文本,不包括标签及其属性。【参考方案2】:我不能 100% 确定我正确理解了这个问题,但也许这会解决您的问题:
page.getWebResponse().getContentAsString()
【讨论】:
getWebResponse() 返回原始页面,没有脚本所做的修改。所以 asXml() 和 asText() 是获取最终页面的更好解决方案。【参考方案3】:我认为没有直接的方法可以将最终页面作为 HTML。 asXml() 以 XML 形式返回结果,asText() 返回提取的文本内容。
您能做的最好的事情就是使用 asXml() 并将其“转换”为 HTML:
htmlPage.asXml().replaceFirst("<\\?xml version=\"1.0\" encoding=\"(.+)\"\\?>", "<!DOCTYPE html>")
(当然,您可以应用更多转换,例如将 转换为 - 这取决于您的要求。)
即使related Google documentation 也推荐这种方法(尽管他们不应用任何转换):
// return the snapshot
out.println(page.asXml());
【讨论】:
【参考方案4】:我不知道没有打开页面类型的答案,对于 XmlPage 和 SgmlPage,必须在 HTML 元素上执行 innerHTML 并手动写出属性。不优雅也不准确(它缺少文档类型),但它可以工作。
Page.getWebResponse().getContentAsString()
这是不正确的,因为它返回原始未渲染的文本形式,没有 js 字节。如果 javascript 执行并更改内容,则此方法将看不到更改。
page.asXml() 将返回 HTML。 page.asText() 将其返回为仅呈现文本。
只是想确认这仅返回文本节点内的文本,不包括标签及其属性。如果您希望获取完整的 HTML,这不是很好的方法。
【讨论】:
【参考方案5】:也许你想使用这样的东西,而不是使用 HtmlUnit 框架的方法:
try (InputStreamReader isr = new InputStreamReader(url.openConnection().getInputStream());
BufferedReader br = new BufferedReader(isr);)
String line ="";
String htmlSource ="";
while((line = br.readLine()) != null)
htmlSource += line + "\n";
return htmlSource;
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
【讨论】:
【参考方案6】:这是适合我的解决方案:
ScriptResult scriptResult = htmlPage.executeJavaScript("document.documentElement.outerHTML;");
System.out.println(scriptResult.getJavaScriptResult().toString());
【讨论】:
以上是关于HtmlUnit - 将 HtmlPage 转换为 HTML 字符串?的主要内容,如果未能解决你的问题,请参考以下文章