2017-10-12 11 views
0

を使用して、私はHTMLのテーブルを読み込み、Excelにデータを書きたいです。 これを達成する最善の方法は何ですか? 私は、3729の行と13529の行を含むHTMLテーブルを持っています。これは、データを読み取るには時間がかかりすぎる〜1Hr +であり、このデータを書き込むためにどれくらいの時間がかかるか想像できません。 ここで何が間違っているのか分かりません。 ご迷惑をおかけして申し訳ございません。前もって感謝します。 Excelシートに読むHTMLテーブルやExcelへの書き込み - セレンwebdriverをするPOI

private List<WebElement> getData(String object){ 
    System.out.println("Object = ="+OR.getProperty(object)); 
    List<WebElement> tr_collection = driver.findElements(By.xpath(OR.getProperty(object))); 
    System.out.println("NUMBER OF ROWS IN THIS TABLE = " + tr_collection.size()); 
    int row_num, col_num; 
    row_num = 1; 
    for (WebElement trElement : tr_collection) { 
     List<WebElement> td_collection = trElement.findElements(By.xpath("td")).size() == 0?trElement.findElements(By.xpath("th")):trElement.findElements(By.xpath("td")); 
     System.out.println("NUMBER OF COLUMNS=" + td_collection.size()); 
     col_num = 1; 
     for (WebElement tdElement : td_collection) { 
      System.out.println("row # " + row_num + ", col # " + col_num + ", text | " + tdElement.getText()); 
      col_num++; 
     } 
     row_num++; 
     System.out.println("================================================================================"); 
    } 
    return tr_collection; 
} 

書き込みデータ:HTML表コードから

データの読み取り

private void writeExcel(List<WebElement> tr_collection,XSSFWorkbook workbook,XSSFSheet spreadsheet,String fileName){ 

    //HSSFRow row; 

    for (int i=0; i<tr_collection.size(); i++) 
    { 
     WebElement webRow = tr_collection.get(i); 
     //Get all cell values in each row 
     List<WebElement> allCells = new ArrayList<>(); 
     if(webRow.findElements(By.tagName("th")).size() > 0){ 

      allCells = webRow.findElements(By.tagName("th")); 
     }else{ 
      allCells = webRow.findElements(By.tagName("td")); 
     } 
     //System.out.println(allCells.size()); 

     if(allCells.size() > 1) 
     { 
      XSSFRow excelRow = spreadsheet.createRow(i); 

      for (int j=0; j<allCells.size(); j++) 
      { 
       WebElement webCell = allCells.get(j); 
       String text = webCell.getText(); 
       XSSFCell cell = excelRow.createCell(j); 
       cell.setCellValue(text); 
      } 
     } 
    } 
    try { 
    FileOutputStream fileOut = new FileOutputStream(fileName); 
    //write this workbook to an Outputstream. 
     workbook.write(fileOut); 

     fileOut.flush(); 
     fileOut.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

さらなる詳細が必要な場合はお知らせください。 – Nag

+0

テーブルを含むページへのリンクや、コーディングしているもののようなサンプルテーブルを共有できますか?出力を高速化するための1つの提案は、CSV(テキストファイル)に書き込むことです。その後、CSVをExcelに簡単にインポートすることができ、おそらく多くの時間を節約できます。書き込みバッファを使用すると、処理が高速化するのに役立ちます。 – JeffC

+0

あなたがそれを行う正確な目的を伝えることができるなら、多くの選択肢があります。あなたの一般的な仕事を減らすためのユーティリティのようなものなら、あなたはアクションクラスとロボットAPIを使ってコピー&ペーストすることさえできます。 –

答えて

0

はそれだけの提案だが、私はそのHTMLテーブルを解析しなければならない場合と私は生のHTMLをダウンロードし、文字列操作や正規表現を使ってテーブルの要素を読んでから、それをCSVファイルに書き出します(上記で既に推奨されています)。これは、Seleniumでテーブルの要素を取得するよりも高速です。ここで約500000個の要素について話しています。これはSeleniumが最適化されたものではありません。 :-)

+0

いくつかのフォーラムを見て、私はHTML解析のためにJSOUP APIを見つけました。私のコードにJsoupをどのように統合すればよいでしょうか? Jsoupを使用してHTMLテーブルを解析し、残りをSeleniumで処理したいとします。 – Nag

+0

これは新しい質問に値すると思います。私はまだJSOUPで作業していませんが、Sereniumよりも高速なHTML "オフライン"を解析できることを理解していますが、JSOUPのパフォーマンスがどういうものか分かりません。 regexとXPath式をHTMLコードで使用することは当然のことです。 JSOUPのさらなる支援が必要な場合は、全く別のトピックなので、新しい質問を開くことをお勧めします。しかし、最初に検索してください。 :-) – AlvaHenrik

+0

更新するだけです。昨日、JSOUPとコードを統合して解析し、同じ巨大なhtmlテーブルをExcelにエクスポートしようとしましたが、それはすぐに点灯していました。 私はまだ自分のコードを最適化するために働く必要があります。bcuz Jsoupは私にはかなり新しいです。返信する時間をとってくれてありがとう。 – Nag

関連する問題