Jsoup,无法从表中获取元素

时间:2013-03-21 23:51:49

标签: java jsoup

我最近一直在和Jsoup搞混。我的朋友喜欢为暗黑破坏神购买黄金,所以我想我会让他成为一个小程序,可以从各个网站获取价格并呈现给他,这样他就可以花尽可能少的钱。通常,我可以像这样抓住价格;

Document Fasteve;

    try {

        Fasteve = Jsoup.connect("http://www.fasteve.com/diablo-3/Gold/?st=US(Normal)").get();
        Elements Price = Fasteve.select("table[class=table_2] tr:eq(5) td:eq(1)");

        System.out.println("http://www.fasteve.com/diablo-3/Gold/?st=US(Normal)");
        System.out.println("1000M Gold = " + Price.text());

    } catch (IOException e) {
        e.printStackTrace();
    }

但是我不能使用那种方法。我也不能使用你所说的tr和td的方法,因为..对于这个网站,所有的tr都有相同的类,所以我不能打电话

Elements Price = Fasteve.select("table[class=table] tr[class=row] td:[class=column]");

The table I am grabbing data from

关于如何抓住这个价值的任何想法? (64.37) 再次感谢Stackoverflow。

1 个答案:

答案 0 :(得分:1)

考虑

  • 创建一个包含td1字符串和td2或价格字符串的类,比如让我们称之为DiabloGoldRow或类似字符串。
  • 创建此类的集合,例如ArrayList<DiabloGoldRow>,或者如果您希望能够根据td1字符串快速获取信息,HashMap<String, DiabloGoldRow>
  • 然后使用JSoup隔离表中的信息,然后在for循环中迭代它,创建DiabloGoldRow对象的实例并将它们放入ArrayList或其他集合(即HashMap)。

我会将代码的详细信息留给学生练习。

修改
你问,

  

为什么我需要创建一个单独的类来保存变量?

因为您需要将每行上的两条信息保持在一起,并且可能需要搜索一行以获取另一条信息。这样做比使用2D数组或并行数组要干净得多。你对此有何异议?

编辑2
你说,

  

我不反对任何事情。我只是想知道这将如何帮助我抓住我需要的价值观。我的问题是使用我通常做的方法,我无法获取我想要的数据。我只是在寻找一种不同的语法来获取指定的数据。

同样,有一种方法可以使用for循环执行此操作。只需循环遍历表格的行:

  Elements eles = doc.select("table tr");

  for (int i = 0; i < eles.size(); i++) {
     Elements rowEles = eles.get(i).select("form");

     Elements goldEles = rowEles.select("[name=gold]");
     String goldValue = goldEles.attr("value");

     Elements priceEles = rowEles.select("[name=price]");
     String priceValue = priceEles.attr("value");

     System.out.printf("%-7s: %-5s%n", goldValue, priceValue);
  }