java - 使用Jsoup从html源代码中获取数据

标签 java android parsing jsoup

我需要访问一个网址并从中提取一些信息。我正在使用 Android Studio。我的代码不会引发任何错误,但它不显示任何信息。我相信问题可能是我正在使用 .select 语句搜索错误的参数。请记住,我对 java/android 开发非常陌生。 这是我的代码:

private class FetchAnton extends AsyncTask<Void, Void, Void> {

    String price;
    String url = "http://www.antoncoop.com/markets/cash.php";


    @Override
    protected Void doInBackground(Void... params) {
        try {

            Document document = Jsoup.connect(url).get();                     
            price = String.valueOf(document.select("quotes['KEH15']"));

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        TextView priceTextView = (TextView) findViewById(R.id.priceTextView);
        priceTextView.setText(price);

    }

}

这里是“quotes['KEH15']”引用的 HTML 部分(向右滚动):

</thead>
            <tbody>
                    <script language="javascript">

                        writeBidRow('Wheat',-60,false,false,false,0.5,'01/15/2015','02/26/2015','All','&nbsp;','&nbsp;',60,'even','c=2246&l=3519&d=G15',quotes['KEH15'], 0-0);
                        writeBidRow('Wheat',-65,false,false,false,0.5,'07/01/2015','07/31/2015','All','&nbsp;','&nbsp;',60,'odd','c=2246&l=3519&d=N15',quotes['KEN15'], 0-0);
                </script>

我需要将代表 html 的“quotes['KEH15']”槽的值获取到称为价格的字符串中。当我运行该程序时,我的 txt View 从默认字符串变为空白。所以我认为代码正在工作,但 TextView 正在使用空白字符串进行更新。谁能帮我解决这个问题吗?

感谢您的帮助。

基思

最佳答案

正如 @njzk2 提到的,你需要一个 javascript 引擎来做到这一点。让我详细说明一下(因为您是初学者,所以我将在这里详细说明)。 Jsoup 只是一个解析器。这意味着什么

  • 它将对您提供的网址进行 HTTP 调用,并检索响应(HTTP 响应)。此响应以及其他一些内容( header 等,如果需要详细信息,请阅读 HTTP 了解更多信息),将包括您想要的 HTML。
  • 它将通过创建适当的 java 对象来生成该 HTML 的结构化表示,这些对象为您提供在教程中读到的所有出色功能(css 选择器等)

正如前面提到的,Jsoup 只是一个解析器。它检索信息,仅此而已。这意味着它无法执行代码来生成新的 HTML fragment 。 这是一个实验。访问一个 url(facebook、gmail、stackoverflow,任何对你有用的东西,但你确定它背后有很多 js)。当您进入该页面时,请使用 Chrome 按 Ctrl+U。它将打开一个新选项卡。此选项卡准确显示了在执行任何 javascript 并生成新 HTML 之前从服务器接收到的 HTML 内容(就像您收到消息时在 facebook 上收到的通知)。现在返回页面并按 F12。它将打开开发工具。在这里你会看到不一样的东西。这是浏览器呈现的实际 HTML。 当您使用 Jsoup 时,您的程序可用的是第一个 HTML,即执行任何 javascript 之前的 HTML,这是因为 Jsoup 无法执行 javascript,因为它只是一个解析器。它不是浏览器。浏览器可以呈现附加内容,因为它可以执行 JavaScript 代码,因为它有 JavaScript 引擎。

有两种选择供您选择。

  1. 如果你想要执行的 JavaScript 很简单,并且它不执行任何“复杂”的 DOM 操作,它只是生成一些字符串或其他什么,那么我想你可以使用 ScriptEngine Java 7 中可以找到它,它可以处理 javascript 的执行。请注意,这是 javascript,而不是 jQuery。 ScriptEngine 不是浏览器。查看教程以更详细地了解您可以完成哪些任务。
  2. 如果缺少 ScriptEngine,那么您将得到 headless browser (没有 GUI 的浏览器)。 headless 浏览器是用于自动化任务的浏览器。检查selenium webdriver 。它们被大量用于测试 Web 应用程序、网站等。但我不知道你是否可以在你的 Android 应用程序中使用它。它足够大(这是完全正常的,因为它提供了很多)并且有一些依赖项,我相信这些依赖项与 android 不能很好地配合(相同的类不同的实现等)。不管怎样,我还没有做过,所以我对此不是100%确定。你必须亲自检查一下。尽管您可以创建一个 Web 应用程序,但它会完成所有解析,并公开一个 Web 服务供您的应用程序使用。

关于java - 使用Jsoup从html源代码中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333194/

相关文章:

ruby - 如何在 Ruby 中将字符串解析为哈希表

android - 在 Android 中使用没有 ksoap2 的 SOAP 网络服务

java - 为什么 OPTIMISTIC_FORCE_INCREMENT 不增加二级缓存中的版本

java - “If”语句未通过检查涉及字符串数组

android - 针对电池消耗优化服务

Android: View 的 anchor 更改后 setTranslationX 出现故障

android - ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent )

parsing - sed 从文件中提取多个可能的(?)值

java - 有没有更好的方法来切换注释代码?

java - 实现两个方法签名相同但返回类型不同的接口(interface)