繁体   English   中英

在Yahoo Finance上使用JSoup提取表数据

[英]Extracting Table Data with JSoup on Yahoo Finance

尝试练习使用JSoup从表中提取数据。 无法弄清楚为什么我不能从中提取“杰出股”字段

https://finance.yahoo.com/q/ks?s=AAPL+Key+Statistics

这是's'是AAPL的两次尝试:

public class YahooStatistics {
String sharesOutstanding = "Shares Outstanding:";

public YahooStatistics(String s)    {
    String keyStatisticsURL = ("https://finance.yahoo.com/q/ks?s="+s+"+Key+Statistics");

//Attempt 1       
    try {
        Document doc = Jsoup.connect(keyStatisticsURL).get();

        for (Element table : doc.select("table.yfnc_datamodoutline1"))  {
            for (Element row : table.select("tr"))  {
                Elements tds = row.select("td");
                for (Element td : tds.select(sharesOutstanding)) {
                    System.out.println(td.ownText());
                }
            }
        }
    }
    catch (IOException ex)   {
        ex.printStackTrace();
    }

//Attempt 2

    try {
    Document doc = Jsoup.connect(keyStatisticsURL).get();

        for (Element table : doc.select("table.yfnc_datamodoutline1"))    {
            for (Element row : table.select("tr"))   {
                Elements tds = row.select("td");
                for (int j = 0; j < tds.size() - 1; j++) {
                    Element td = tds.get(j);
                    if ((td.ownText()).equals(sharesOutstanding)) {
                    System.out.println(tds.get(j+1).ownText());
                    }
                }
            }
        }
    }
    catch(IOException ex)   {
        ex.printStackTrace();
    }

尝试返回:BUILD SUCCESSFUL,仅此而已。

我已禁用浏览器上的JavaScript,并且该表仍显示,所以我假设这不是用JavaScript编写的,而是HTML。

任何建议表示赞赏。

编辑后有关您的来源的注意事项:

  • 您应该比较ownText()而不是text() text()为您提供所有元素及其所有子元素的组合文本。 在这种情况下,该元素包含Shares Outstanding<font size="-1"><sup>5</sup></font>:因此其组合文本为"Shares Outstanding5:" 如果您使用ownText ,它将只是"Shares Outstanding:"
  • 注意冒号( : )。 相应地更新sharesOutstanding的值。
  • 您给它传递了错误的URL。 AAPL之后应有一个+
  • 您的当前查询(至少第二次尝试)两次返回该元素,因为存在一个嵌套表,因此它两次查找TD。

找到匹配项后,您可以中断循环,返回原始版本(如上所述,进行了更正)-请参见注释-您也可以尝试使用仅匹配一次的更复杂的查询:

Elements elems = doc.select("td.yfnc_tablehead1:containsOwn("+sharesOutstanding+") + td.yfnc_tabledata1");

if ( ! elems.isEmpty() ) {
    System.out.println( elems.get(0).owntext() );
}

该选择器为您提供所有类为yfnc_tabledata1td元素,其前一个同级为一个类为yfnc_tablehead1且其自身文本包含“ Shares Outstanding:”字符串的td元素。 基本上,这应该选择您需要的确切TD。

注意:此答案的先前版本对Elements.select()Element.select()之间的区别感到不安。 事实证明,我错了,如果您更正了上述四点,您的原始版本应该可以正常工作。 因此,将记录设置为直截了当: Elements上的select()实际上确实在每个元素内查找,并且结果列表可能包含原始列表中与所选内容匹配的任何元素的后代。 对于那个很抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM