1

我创建了一个基本的 GWT (Google Web Toolkit) Ajax 应用程序,现在我正在尝试为读取页面的爬虫创建快照

我使用 HtmlUnit 创建了一个 Servlet 来响应爬虫。

当我在浏览器上时,我的应用程序运行良好。但是在 HtmlUnit 中,它会引发很多关于我在 HTML 中的特殊字符的错误。但是这些字符是内容,我不想用特殊代码替换它,一旦它当前工作,只是因为 HtmlUnit。(至少我应该先检查一下我是否正确使用了 HtmlUnit)

我的页面有错误

我认为 HtmlUnit 应该读取页面的字符集信息并将其呈现为浏览器,一旦它是我认为的项目目标。

我还没有找到关于这个问题的好信息。这是 HtmlUnit 限制吗?我是否需要更改我网站的所有内容才能使用这个 java 库来拍摄快照?

这是我的代码:

if ((queryString != null) && (queryString.contains("_escaped_fragment_"))) {
            // ok its the crawler
            // rewrite the URL back to the original #! version
            // remember to unescape any %XX characters

            url = URLDecoder.decode(url, "UTF-8");

            String ajaxURL = url.replace("?_escaped_fragment_=", "#!");


            final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);


            HtmlPage page = webClient.getPage(ajaxURL);

            // important!  Give the headless browser enough time to execute JavaScript
            // The exact time to wait may depend on your application.
            webClient.waitForBackgroundJavaScript(3000);

            // return the snapshot
            response.getWriter().write(page.asXml());
4

1 回答 1

0

问题是 XML 与 HTML 冲突。@ColinAlworth 的评论帮助了我。

我按照谷歌的例子,没有工作。

要让它工作,您需要删除 XML 标记并只响应 HTML,更改以下行:

 // return the snapshot
 response.getWriter().write(page.asXml());

 response.getWriter().write(page.asXml().replaceFirst("<\\?.*>",""));

现在它正在渲染。

但是虽然它正在渲染,但 CSS 没有工作,并且 DOM 没有更新(GWT 在页面打开时更新页面标题)。HTMLUnit 引发了很多关于 CSS 的错误,我正在使用 twitter bootstrap 没有任何更改。显然,HtmlUnit 项目有很多错误,适合小型测试,但不适合解析复杂(甚至简单)的 HTML。

于 2014-05-27T11:20:36.470 回答