Android JSOUP从网站解析表

时间:2012-01-31 20:06:05

标签: android parsing web html-table jsoup

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

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();
    }
}

我需要能够将usd的表格与其他货币一起使用,以便我可以将其存储在数据库中,然后将其用于转换。我相信我需要关注的部分是:

       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);
    
  • 将表格<td>分解为国家/地区和转化率,然后将其放入数据库。

我正在寻找指导,请记住,我是全新的,我想构建这个应用程序的学习经验和弹簧板更大更好的应用程序,示例代码绝对欢迎,我将感激所有我能得到的帮助。

2 个答案:

答案 0 :(得分:1)

如果您要做的只是货币转换,我建议您使用(免费)Yahoo API来完成此操作。你可以在this回答中阅读所有关于细节的信息,但基本上你会得到如下内容:

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

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

答案 1 :(得分:1)

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

但是,我已经使用其他网站为您提供了基本解决方案。您可以看到,当网站使用类和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());
        }
    }