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

时间:2015-02-04 22:58:57

标签: 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);

    }

}

以下是“引用['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>

我需要将代表“引号['KEH15']”html插槽的值转换为名为price的字符串。当我运行程序时,我的txt视图从默认字符串变为空白。所以我认为代码工作正常,但文本视图正在使用空白字符串进行更新。有人可以帮我解决这个问题吗?

感谢您的帮助。

基思

1 个答案:

答案 0 :(得分:2)

正如@ n​​jzk2所提到的,你需要一个javascript引擎才能做到这一点。让我详细说明(因为你是初学者,我将在这里详细描述)。 Jsoup只是一个解析器。这意味着什么

  • 它将对您提供的URL进行HTTP调用,并将检索响应,即HTTP响应。如果您需要详细信息,此回复以及其他一些内容(标题等,在HTTP上阅读更多内容)将包含您所追求的HTML。
  • 它将通过创建适当的java对象生成该HTML的结构化表示,该对象为您提供了在教程中阅读的所有优秀功能(css选择器等)

如前所述,Jsoup只是一个解析器。它只检索信息。这意味着它无法执行代码来生成新的HTML片段。 这是一个实验。访问一个网址(facebook,gmail,stackoverflow,无论什么对你有用,但你确定它背后有很多js)。当您在该页面时按Ctrl + U与Chrome。它将打开一个新标签。此选项卡显示了在执行任何javascript之前从服务器收到的HTML的确切内容以及生成新的HTML(例如,当您收到消息时,您在Facebook上收到的通知)。现在返回页面并按F12键。它将打开开发工具。在这里你会看到不同的东西。这是浏览器呈现的实际HTML。 当你使用Jsoup时,你的程序可用的是第一个HTML,执行任何javascript之前的那个,那是因为Jsoup无法执行javascript,因为它只是一个解析器。它不是一个浏览器。浏览器可以呈现其他内容,因为它可以执行javascript代码,因为它有一个javascript引擎。

您有两种选择。

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