34

我花了一天时间研究可用于完成以下任务的库:

  • 在后台检索网页的全部内容,而不将结果呈现给视图。
  • 例如,该库应支持在初始 HTML 加载后触发 ajax 请求以加载一些额外结果数据的页面。
  • 从生成的 html 中,我需要以 xpath 或 css 选择器形式获取元素。
  • 将来我还可能需要导航到下一页(触发事件、提交按钮/链接等)

这是我没有成功的尝试:

  • Jsoup:效果很好,但不支持 javascript/ajax(所以它不会加载整页)
  • Android 内置 HttpEntity:javascript/ajax 与 jsoup 存在相同问题
  • HtmlUnit:看起来正是我所需要的,但数小时后无法让它在 Android 上运行(其他用户尝试加载 12MB+ 的 jar 文件失败。我自己加载了完整的源代码并将其作为项目库引用只是为了发现Android 中不存在 Applets 和 java.awt(由 HtmlUnit 使用)之类的东西)。
  • Rhino - 我觉得这很令人困惑,不知道如何让它在 Android 中运行,即使它是我正在寻找的。
  • Selenium 驱动程序:看起来它可以工作,但您没有直接的方法以无头方式实现它,因此您不会将实际的 html 显示到视图中。

我真的希望 HtmlUnit 能够工作,因为它似乎最适合我的解决方案。有什么方法或至少我错过了另一个适合我需要的图书馆吗?

我目前使用的是 Android Studio 0.1.7,如果需要可以移至 Ellipse。

提前致谢!

4

2 回答 2

35

好的 2 周后我承认失败并正在使用目前对我有用的解决方法。

问题:
将 HTMLUnit 移植到 Android 太困难了(或者至少以我的专业水平)。我确信它是一个有价值的项目(对于有经验的 Java 程序员来说并不那么耗时)。我给 HTMLUnit 的人发了电子邮件,他们评论说他们没有研究端口或将涉及什么工作,但建议任何想要开始这样一个项目的人都应该向他们的邮件列表发送消息,以让更多的开发人员参与进来(http: //htmlunit.sourceforge.net/mail-lists.html )。

解决方法:
我使用android内置的WebView并覆盖了Webview类的onPageFinished方法来注入Javascript,在页面完全加载后抓取所有的html。Webview 还可用于调用更多的 javascript 操作、单击按钮、填写表单等。

代码:

webView.getSettings().setJavaScriptEnabled(true);
MyJavaScriptInterface jInterface = new MyJavaScriptInterface();
webView.addJavascriptInterface(jInterface, "HtmlViewer");

webView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {
       //Load HTML
       webView.loadUrl("javascript:window.HtmlViewer.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    }

}

webView.loadUrl(StartURL);
ParseHtml(jInterface.html);   

public class MyJavaScriptInterface {

    public String html;

    @JavascriptInterface
    public void showHTML(String _html) {
        html = _html;
    }
}
于 2013-07-17T15:18:33.147 回答
0

我已经采用了上面提到的实现(注入 JavaScript),这对我有用。我所做的只是将 webview 的可见性设置为隐藏在其他 UI 元素下。我也在考虑对硒做同样的事情。我在 Python 中将 selenium 与 Chrome 一起使用,它很棒,但就像你提到的那样,不显示浏览器窗口并不容易。但我认为在 Android 中不显示组件是可能的。我得试试。

于 2019-05-26T06:01:41.880 回答