我需要访问一个网址并从中提取一些信息。我正在使用 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']”槽的值获取到称为价格的字符串中。当我运行该程序时,我的 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 引擎。
有两种选择供您选择。
- 如果你想要执行的 JavaScript 很简单,并且它不执行任何“复杂”的 DOM 操作,它只是生成一些字符串或其他什么,那么我想你可以使用 ScriptEngine Java 7 中可以找到它,它可以处理 javascript 的执行。请注意,这是 javascript,而不是 jQuery。 ScriptEngine 不是浏览器。查看教程以更详细地了解您可以完成哪些任务。
- 如果缺少 ScriptEngine,那么您将得到 headless browser (没有 GUI 的浏览器)。 headless 浏览器是用于自动化任务的浏览器。检查selenium webdriver 。它们被大量用于测试 Web 应用程序、网站等。但我不知道你是否可以在你的 Android 应用程序中使用它。它足够大(这是完全正常的,因为它提供了很多)并且有一些依赖项,我相信这些依赖项与 android 不能很好地配合(相同的类不同的实现等)。不管怎样,我还没有做过,所以我对此不是100%确定。你必须亲自检查一下。尽管您可以创建一个 Web 应用程序,但它会完成所有解析,并公开一个 Web 服务供您的应用程序使用。
关于java - 使用Jsoup从html源代码中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333194/