【问题标题】:Get data from a website with Java使用 Java 从网站获取数据
【发布时间】:2011-07-27 09:29:23
【问题描述】:

我尝试使用以下代码从亚马逊网站获取一些数据:

public class Bot {

    public static void main(String[] args) throws IOException {

        BufferedReader buff;
        InputStreamReader inStream;
        String htmlCode = null;
        try{
            URL url = new URL("http://www.amazon.it/gp/bestsellers/electronics/473246031/ref=s9_dnav_bw_ir12_z?pf_rd_m=A11IL2PNWYJU7H&pf_rd_s=center-1&pf_rd_r=1VC27Z69NFM1FJAR2YNY&pf_rd_t=101&pf_rd_p=245982287&pf_rd_i=412609031");
            URLConnection urlConnection = (URLConnection)url.openConnection();



            inStream = new InputStreamReader(urlConnection.getInputStream());
            buff = new BufferedReader(inStream);

            while(true){
                if (buff.readLine()!=null){
                    htmlCode += buff.readLine() + "\n";
                }else{
                    break;
                }
            }

            int startFrom = htmlCode.indexOf("<div class=\"zg_rank\">");
            int endFrom = htmlCode.indexOf("</div>");

            String idNumber = htmlCode.substring(startFrom, endFrom);

            System.out.println(idNumber);
        }catch(Exception e){};  

    }

}

那么我做错了什么?我该如何解决这个问题?

【问题讨论】:

  • 请更详细地描述您的问题。另外,不要吞下异常。
  • 我认为问题在于,当我将 html 源代码放在 htmlCode 中时,它与实际代码不同,因此,当我使用 startFrom 和 endFrom 创建子字符串时,它不起作用。我该如何解决?

标签: java web-scraping web


【解决方案1】:

不,我的朋友,你的代码是正确的。但是,字符串实例不能容纳整个页面。 以下是您如何从有问题的 div 的开头指向结尾:

boolean CodeNeeded = false;

while ((line = br.readLine()) != null) {
    // Here I Point on the beginig of the Code needed
    if(line.contains("<div class=\"zg_rank\">")){
        CodeNeeded = true;
    }

    // Here I Point on the End of the Code needed
    if (line.contains("</div>")) {
        CodeNeeded = false;
    }        
    // If the Code is needed Stored it in DivWanted
    if(CodeNeeded) {
        DivWanted += line + "\n";
    }    
} 

【讨论】:

    【解决方案2】:

    我正在尝试使用心灵感应,我认为它有效!

    我认为你的问题是endFrom。试试这个:

    int endFrom = htmlCode.lastIndexOf("</div>"); // lastIndexOf, not indexOf
    

    否则,您将只能到达第一个 &lt;/div&gt;

    已编辑:

    要在开始后获得下一个 &lt;/div&gt;,请使用:

    int endFrom = htmlCode.indexOf("</div>", startFrom); // Add 2nd parameter
    

    【讨论】:

    • Ok :) ,使用 lsatIndexOf 我得到 startFrom 索引之后的第一个
      ? :)
  • 它不能按我的需要工作。因为我需要 2 标签
    1
    的内容,所以程序必须打印 1 而不是现在打印的内容。如何在
    之后获取
    的索引?谢谢。
  • 你见过JSoup吗?它会让这种刮擦变得更容易。
  • 我现在就试试。顺便说一句,尝试打印 HTMLCode 并将其与浏览器可以看到的代码进行比较,例如使用 firebug,为什么它不同??
  • 【解决方案3】:

    也许您需要尝试类似的方法:

    int startFrom = htmlCode.indexOf("<div class=\"zg_rank\">");
    int endFrom = htmlCode.indexOf("</div>", startFrom);
    

    比你先搜索&lt;/div&gt; 出现在&lt;div class="zg_rank"&gt; 之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多