我需要访问一个网址并从中获取一些信息。我正在使用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',' ',' ',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',' ',' ',60,'odd','c=2246&l=3519&d=N15',quotes['KEN15'], 0-0);
</script>
我需要将表示html的“ quotes ['KEH15']”槽的值插入名为price的字符串中。当我运行该程序时,我的txt视图从默认字符串变为空白。因此,我认为代码可以正常工作,但是正在使用空白字符串更新文本视图。谁能帮我解决这个问题?
感谢您的帮助。
基思
最佳答案
正如@ njzk2所提到的,您需要一个JavaScript引擎来做到这一点。让我详细说明一下(由于您是初学者,因此我将在这里详细介绍一下)。
Jsoup只是一个解析器。这是什么意思
它将对您提供的网址进行HTTP调用,并检索一个响应,即HTTP响应。除其他事项外,此响应(标题等,如果需要详细信息,请阅读HTTP上的更多内容)将包括您想要的HTML。
通过创建适当的java对象,它将为您生成HTML的结构化表示,这些Java对象为您提供了您在本教程中了解的所有出色功能(css选择器等)
如前所述,Jsoup只是一个解析器。它检索信息,仅此而已。这意味着它无法执行代码以产生新的HTML片段。
这是一个实验。访问一个URL(facebook,gmail,stackoverflow,任何适合您的方法,但是您肯定背后都有很多js)。当您进入该页面时,请在Chrome中按Ctrl + U。它将打开一个新标签。此选项卡准确显示在执行任何JavaScript并生成新HTML之前从服务器接收到的HTML(例如,收到消息时在Facebook上收到的通知)。现在返回页面并按F12键。它将打开开发工具。在这里,您将看到不同的东西。这是浏览器呈现的实际HTML。
当您使用Jsoup时,您的程序可用的是第一个HTML,即执行任何javascript之前的HTML,这是因为Jsoup无法执行javascript,因为它只是一个解析器。它不是浏览器。浏览器可以执行附加的内容,因为它可以执行javascript代码,因为它具有javascript引擎。
有两个选项供您选择。
如果要执行的javascript很简单,并且不执行任何“复杂”的DOM操作,它只会生成一些字符串或其他内容,那么我想您可以使用Java 7中的ScriptEngine,并且处理javascript的执行。请注意,它是JavaScript,而不是jQuery。 ScriptEngine不是浏览器。查看教程,详细了解您可以完成的工作。
如果缺少ScriptEngine,则会留下headless browser(没有GUI的浏览器)。无头浏览器是用于自动任务的浏览器。检查selenium webdriver。它们大量用于测试Web应用程序,网站等。我不知道您是否可以在Android应用程序中使用它。它足够大(这是完全正常的,因为它提供了很多东西),并且具有一些依赖关系,我相信这些依赖关系不能与android很好地配合使用(相同的类,不同的实现等)。无论如何,我还没有做到,所以我对此不是100%的确定。您必须自己检查一下。尽管您可以制作一个Web应用程序,但可以进行所有解析,并且公开了供您的应用程序使用的Web服务。