我如何从HTML获取细节?

时间:2012-07-16 19:32:30

标签: java html urlconnection

我有一些java代码可以从我选择的网站打印出html。我希望它只打印HTML代码中的特定日期,如下所示:

<tr class="bgWhite">
  <td align="center" width="50"><nobr>GD&#160;</nobr></td>
  <td align="center">Q3&#160;2012</td>

  <td align="left" width="*">Q3 2012 General Dynamics Earnings Release</td>
  <td align="center">$ 1.83&#160;</td>
  <td align="center">n/a&#160;</td>
  <td align="center">$ 1.83&#160;</td>
  <td align="center"><nobr>24-Oct-12</nobr></td>
</tr>
<tr class="bgWhite">
  <td align="center" width="50"><nobr>GD&#160;</nobr></td>
  <td align="center">Q2&#160;2012</td>

  <td align="left" width="*">Q2 2012 General Dynamics Earnings Release</td>
  <td align="center">$ 1.75&#160;</td>
  <td align="center">n/a&#160;</td>
  <td align="center">$ 1.79&#160;</td>
  <td align="center"><nobr>25-Jul-12 BMO</nobr></td>
</tr>

所以我只想打印出来:     24-OCT-12     25-JUL-12

我该怎么做?

以下是我的代码:

String nextLine;
URL url = null;
URLConnection urlConn = null;
InputStreamReader  inStream = null;
BufferedReader buff = null;

try{
    // Create the URL obect that points
    // at the default file index.html
    url  = new URL("http://www.earnings.com/company.asp?client=cb&ticker=gd");
    urlConn = url.openConnection();
    inStream = new InputStreamReader( 
                       urlConn.getInputStream());
    buff= new BufferedReader(inStream);

    // Read and print the lines from index.html
    while (true){
        nextLine =buff.readLine();  
        if (nextLine !=null){
            System.out.println(nextLine); 
        }
        else{
           break;
        } 
    }
 } catch(MalformedURLException e){
   System.out.println("Please check the URL:" + 
                                       e.toString() );
 } catch(IOException  e1){
  System.out.println("Can't read  from the Internet: "+ 
                                      e1.toString() ); 
}

2 个答案:

答案 0 :(得分:3)

与低级别java.net.URLConnection相比,为作业使用完整的HTML解析器更容易。但是,由于目标网站生成绝对非语义的HTML(一个和所有没有任何语义标识符/类的表,就像普通90的网站看起来那样(yuck)),甚至对于一个体面的HTML解析器来说也很难解析它。但无论如何,这是一个完整的启动示例,使用Jsoup打印出您需要的信息:

Document document = Jsoup.connect("http://www.earnings.com/company.asp?client=cb&ticker=gd").get();
Elements dateColumn = document.select("table:eq(0) tr:eq(0) table:eq(7) tr:eq(2) table:eq(4) td:eq(6):not(.dataHdrText02)");

for (Element dateCell : dateColumn) {
    System.out.println(dateCell.text());
}

这就是全部。无需使用低级别java.net.URLConnection或详细的SAX解析器。

另见:

答案 1 :(得分:1)

我认为这是SAX解析器的标准UC。你不应该逐行(你不能指望html文档总是按照它当前的组织,所以使用SAX解析器将是一个更灵活的解决方案。)

如果您有关于文档大小的信息,并且您知道它不会增长很多,您也可以使用DOM解析器。但是从这个角度来看,SAX解析器也更好。