【问题标题】:Android JSOUP Parsing Tables fromWeb SitesAndroid JSOUP 解析来自网站的表格
【发布时间】:2012-01-31 20:06:04
【问题描述】:

我在解析以下网站时遇到问题:

http://www.x-rates.com/d/USD/table.html

我对 android 编程非常非常陌生,我正在考虑创建一个货币转换器,但是现在我知道那里有很多,我正在尝试快速跟踪我的编程启动并让自己沉浸在代码中.

我找到了一个试图解释的教程,它对需要特定项目的网站很有帮助。代码如下:

package com.ve.webgrab;

import java.io.IOException;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.view.View;

public class WebgrabActivity extends ListActivity {

public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

ArrayList<String> tableRowStrings = new ArrayList<String>();

Document doc = null;
        try {
            doc = Jsoup.connect("http://www.x-rates.com/d/USD/table.html").get();
        } 
        catch (IOException e) {
            e.printStackTrace();
        }

       String testString  = "American";
        Elements tableRows = doc.select("tr");
        for (Element tableRow : tableRows){
             if (tableRow.hasText()){
                    String rowData = tableRow.text();
                    if(rowData.contains(testString)){
                            tableRowStrings.add(rowData);
                }
          }
    } 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tableRowStrings);
        setListAdapter(adapter);
  }

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        String item = (String) getListAdapter().getItem(position);
        Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
    }
}

我需要能够将带有美元的表转换为其他货币,以便我可以将其保存在数据库中,然后将其用于转换。我认为我需要查看的部分是:

       String testString  = "American";
        Elements tableRows = doc.select("tr");
        for (Element tableRow : tableRows){
             if (tableRow.hasText()){
                    String rowData = tableRow.text();
                    if(rowData.contains(testString)){
                            tableRowStrings.add(rowData);
                }
          }
    } 

我需要完成的事情:

  • 获取网站:- - 我相信这已经完成了:-

            doc = Jsoup.connect("http://www.x-rates.com/d/USD/table.html").get();
    
  • 选择网站上对转化率特别感兴趣的表格: - 仍然无法弄清楚这部分。

  • 测试表格以确保它是正确的:

       String testString  = "American";
    
                    if(rowData.contains(testString)){
    
  • 将表格上的数据显示到列表视图中,以确保收集到正确的数据:

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tableRowStrings);
        setListAdapter(adapter);
    
  • 将表格&lt;td&gt;分解为国家和转化率,然后将其放入数据库中。

我正在寻找指导,请记住,我对此完全陌生,我想构建这个应用程序以获得学习体验和更大更好的应用程序的跳板,绝对欢迎示例代码,我将不胜感激我能得到的帮助。

【问题讨论】:

  • 该网站很难提取您想要的内容,因为它不使用任何 id 或类名来指示任何内容或位置。您是否致力于这个特定的网站,或者您是否可以使用另一个可能有一些句柄以便更好地选择的网站?
  • 我没有被困在网站上,我对选择持开放态度,正如我之前所说的,我是新手。

标签: android parsing web html-table jsoup


【解决方案1】:

我赞成 Marvin 的回答,因为从长远来看,使用雅虎提供的网络服务可能会更可靠。

但是,我已经为您使用其他网站准备了一个基本解决方案。当站点使用类和 id 来帮助您选择正确的东西而不是遍历所有元素并寻找某些东西来找到您想要的信息时,您可以看到需要的代码少了多少。您需要稍微修复此代码以检查错误并满足您的需求,但如果您仍想走这条路,它应该可以帮助您开始。

    //Get the HTML from the source
    Document doc = Jsoup.connect("http://www.exchangerate.com/").get();
    //select all the tr elements within the tbody elements within
    //the table with class name table_text_small
    //and iterate over all of those elements
    for (Element e : doc.select("table.table_text_small > tbody > tr")) {
        //this is a little hackish, but check to make sure this tr has
        //at least 5 children (tds)
        if (e.children().size() >= 5) {
            //if so, print out the 1st child (country name)
            //and the 5th child (exchange rate)
            System.out.println(e.child(1).text() + ":" + e.child(4).text());
        }
    }

【讨论】:

  • 嘿,这看起来很棒,正如我之前所说,我对此很陌生,我愿意尝试任何事情,从而增加我的知识。
  • 我相信我已经理解了您的代码并稍微集成了考虑到 ISO 标签的各个方面,它不是真正的国家代码,而是关于国家代码的标签。修改见下文: for (Element e : doc.select("table.table_text_small > tbody > tr")) { if (e.children().size() >= 5) { if(e.child(3 ).text().equals(ignore)){ String rowData = ""; }else { String rowData = e.child(3).text() + ":" + e.child(5).text(); tableRowStrings.add(rowData);
【解决方案2】:

如果您只想货币转换,我建议您使用(免费)Yahoo API 来完成这项工作。您可以在this 答案中阅读有关详细信息的所有信息,但基本上您会得到如下内容:

http://download.finance.yahoo.com/d/quotes.csv?s=GBPEUR=X&f=sl1d1t1ba&e=.csv

它将从 GBP 转换为 EUR 并生成一个易于解析的文本文件。正如@B.Anderson 已经指出的那样,在该网站上使用 JSoup 会非常棘手。

【讨论】:

  • 好的,但这意味着我需要在所有国家/地区代码中编码,然后使用适当的代码创建链接。
  • @cchinchoy 是的,您需要提前知道货币代码。
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多