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 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

获取页面的可见文本

如何将 SOCKS 与 HtmlUnit 一起使用?

使用 htmlunit -Java 访问 Javascript 生成的 html

如何使用HtmlUnit显示所有AJAX请求

HtmlUnit---网页抓取工具解析及使用

硒与 HtmlUnit? [关闭]