2011-07-11 20 views
0

コンテンツ/タイプがtext/htmlのすべてのURLを取得できますが、コンテンツ/タイプがtext/htmlでないURLを必要とする場合。それではどうすればそれを確認できますか?文字列のためとして、我々はcontainsメソッドを使用することができますが、それはnotcontainsようなものを持っていません。..任意の提案は理解されるであろう...そしてまたコンテンツタイプがtext/htmlでないクロールでURLを取得する

The key variable contains: 

Content-Type=[text/html; charset=ISO-8859-1] 

これは、以下のtext/htmlのをチェックするためのコードとIですtext/htmlではないcontent-typeも試しましたが、content-typeもtext/htmlのものも表示します。

try { 
      URL url1 = new URL(url); 
      System.out.println("URL:- " +url1); 
      URLConnection connection = url1.openConnection(); 

      Map responseMap = connection.getHeaderFields(); 
      Iterator iterator = responseMap.entrySet().iterator(); 
      while (iterator.hasNext()) 
      { 
       String key = iterator.next().toString(); 

       if (key.contains("text/html") || key.contains("text/xhtml")) 
       { 
        System.out.println(key); 
        // Content-Type=[text/html; charset=ISO-8859-1] 
        if (filters.matcher(key) != null){ 
         System.out.println(url1); 
         try { 
          final File parentDir = new File("crawl_html"); 
          parentDir.mkdir(); 
          final String hash = MD5Util.md5Hex(url1.toString()); 
          final String fileName = hash + ".txt"; 
          final File file = new File(parentDir, fileName); 
          boolean success =file.createNewFile(); // Creates file crawl_html/abc.txt 


          System.out.println("hash:-" + hash); 

            System.out.println(file); 
          // Create file if it does not exist 



           // File did not exist and was created 
           FileOutputStream fos = new FileOutputStream(file, true); 

           PrintWriter out = new PrintWriter(fos); 

           // Also could be written as follows on one line 
           // Printwriter out = new PrintWriter(new FileWriter(args[0])); 

              // Write text to file 
           Tika t = new Tika(); 
           String content= t.parseToString(new URL(url1.toString())); 


           out.println("==============================================================="); 
           out.println(url1); 
           out.println(key); 
           out.println(success); 
           out.println(content); 

           out.println("==============================================================="); 
           out.close(); 
           fos.flush(); 
           fos.close(); 



         } catch (FileNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 

          e.printStackTrace(); 
         } catch (TikaException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 


         // http://google.com 
        } 
       } 
    else if (!connection.getContentType().startsWith("text/html"))//print duplicate records of each url 
       //else if (!key.contains("text/html")) 
       { 
        if (filters.matcher(key) != null){ 
        try { 
         final File parentDir = new File("crawl_media"); 
         parentDir.mkdir(); 
         final String hash = MD5Util.md5Hex(url1.toString()); 
         final String fileName = hash + ".txt"; 
         final File file = new File(parentDir, fileName); 
        // Create file if it does not exist 
         boolean success =file.createNewFile(); // Creates file crawl_html/abc.txt 


         System.out.println("hash:-" + hash); 

         Tika t = new Tika(); 
         String content_media= t.parseToString(new URL(url1.toString())); 



          // File did not exist and was created 
          FileOutputStream fos = new FileOutputStream(file, true); 

          PrintWriter out = new PrintWriter(fos); 

          // Also could be written as follows on one line 
          // Printwriter out = new PrintWriter(new FileWriter(args[0])); 

             // Write text to file 
          out.println("==============================================================="); 
          out.println(url1); 
          out.println(key); 
          out.println(success); 
          out.println(content_media); 
          //out.println("==============================================================="); 
          out.close(); 
          fos.flush(); 
          fos.close(); 




        } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 

         e.printStackTrace(); 
        } catch (TikaException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        } 

       } 



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



     System.out.println("============="); 
    } 
} 

一つの方法は、それがアプリケーション/ PDF

if (key.contains("application/pdf") 

とXMLのための同じように...しかし、これ以外の任意の他の方法でPDFファイルのためのように、各コンテンツ・タイプごとに個別にチェックすることです...

答えて

1

これは役に立ちますか?他の形式のコンテンツタイプは、おそらくコンテンツタイプごとに明示的な例を必要とする各タイプと異なる場合がありますので

if (key.contains("text/html") || key.contains("text/xhtml")) { 
    //Do stuff 
} else if (key.contains("application/pdf") { 
    //Do other stuff 
} else { 
    //All other cases 
} 

を:

if (!connection.getContentType.startsWith("text/html")) 
+0

これは動作しません。また、content-typeがtext/htmlのリンクも取ります。その他のアイデア..また、text/htmlとnon text/htmlが使用されています。 – ferhan

+0

このようにしますか? getContentTypeが "["も返す場合は、getContentType.substring(1)を使用してそれを取り除きます。 – emboss

+0

これは動作していますが、重複したレコードを印刷しています。特定のURLについては、応答に多数のヘッダーがあります。それぞれのヘッダーがあり、ヘッダーが 'text/html'で始まらない場合は、そのURLを出力します。text/html以外の特定のURLには8ヘッダーが含まれていれば、そのURLを出力します8私が言っていることを理解したいと思っています。 – ferhan

0

使用しての何が問題になっています。一般的なコンテンツタイプに遭遇した場合、汎用メソッド(else)は十分ではありませんか? Strategy Patternがここで役に立つかもしれません。

私はあなたの問題を誤解した場合、私のお詫び申し上げます。試運転によって異なる値のkeyがどのようなものであるかのサンプルプリントアウトを提供できますか? (コードの10行目)

+0

返信してくれてありがとうございます..問題は、いくつのコンテンツタイプがあるのか​​分かりません。私の場合は2つのものが必要です.1つはすべてcontent-typeがtext/htmlまたはtext/xhtmlのURLです。 content-typeがtext/htmlまたはtext/xhtml以外のすべてのURLです。したがって、1つの方法は、各URLを印刷してコンテンツタイプを表示し、そのコンテンツタイプに対してelse if loopを追加することです。しかし、将来他のコンテンツタイプの他のページを追加すると、そのコンテンツタイプを見逃す可能性があります。あなたが今理解してくれることを願っています... – ferhan

+0

'key'は、特定のURLのレスポンスヘッダの値を含んでいます。したがって、各URLにはcontent-typeがありますので、text/htmlをチェックしています。 – ferhan

+0

あなたの場合、可能な既知のコンテンツタイプのソリューションを実装し、不明なコンテンツタイプに遭遇した場合にユーザーに警告を与えるのが最善の方法です。 100%のケースで動作するシステムを作成することは不可能なので、不明なコンテンツタイプのイベントで重大なエラーが発生するのを防ぐことが目標です。未知の/未処理のコンテンツタイプを捕まえ、警告を出力するか、(おそらく正規表現を使用して) "ベストエフォート"の方法を与えるのに、予期せぬ動作のために準備するために、 'else'の場合を使用してください。 – Grambot

関連する問題