2017-10-12 13 views
0

Je souhaite lire une table html et écrire des données dans Excel. Quel est le meilleur et le moyen le plus rapide d'y parvenir? J'ai un tableau HTML contenant 13529 lignes avec 37 colonnes. Ce qui prend beaucoup trop de temps pour lire les données ~ 1Hr +, et je ne peux pas imaginer combien de temps cela prendrait pour écrire ces données pour exceller. Je ne sais pas ce que je fais mal ici. Toute suggestion est appréciée. Merci d'avance.Lire le tableau HTML et écrire dans Excel - Selenium WebDriver utilisant POI

Lire les données de code Tableau HTML:

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; 
} 

écrire des données dans Excel Sheet:

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

Faites-moi savoir si d'autres détails sont requis. – Nag

+0

Pouvez-vous partager un lien vers la page qui contient la table ou un exemple de tableau comme ce que vous êtes en train de coder? Une suggestion pour rendre la sortie plus rapide est d'écrire en CSV (fichier texte). Vous pouvez ensuite importer le fichier CSV dans Excel facilement et cela vous fera probablement gagner BEAUCOUP de temps. L'utilisation d'un tampon d'écriture aidera aussi les choses à aller plus vite. – JeffC

+0

Si vous êtes capable de dire le but exact de le faire, il existe de nombreuses options. Si c'est quelque chose comme un utilitaire pour réduire votre travail général, vous pouvez même copier et coller en utilisant la classe d'actions et l'API Robot. –

Répondre

0

Il est juste une suggestion, mais si je devais analyser cette table HTML et l'obtenir dans Excel je voudrais télécharger le HTML brut, lire les éléments de la table avec des opérations de chaîne ou regex, puis l'écrire dans un fichier CSV (comme déjà recommandé ci-dessus). C'est beaucoup plus rapide que d'obtenir les éléments de la table avec Selenium. Nous parlons ici de 500000 éléments. Ce n'est pas ce pour quoi Selenium est optimisé. :-)

+0

En passant par quelques forums, je suis tombé sur JSOUP api pour l'analyse HTML. Toute idée comment intégrer Jsoup à mon code? Je veux analyser la table HTML en utilisant Jsoup et faire le reste en utilisant Selenium. – Nag

+0

Je pense que cela serait digne d'une nouvelle question. Je n'ai pas encore travaillé avec JSOUP mais d'après ce que je comprends vous pouvez analyser le HTML "offline" qui est plus rapide qu'avec Selenium, mais je ne connais pas la performance de JSOUP, et je m'attendrais encore à une énorme différence entre expressions regex et XPath sur le code HTML en faveur de regex bien sûr. Si vous avez besoin d'aide supplémentaire avec JSOUP, je vous recommande d'ouvrir une nouvelle question parce que c'est un sujet complètement différent. Mais faites d'abord une recherche. :-) – AlvaHenrik

+0

Juste pour mettre à jour. hier, j'ai intégré mon code avec JSOUP pour analyser et essayé d'exporter la même énorme table html pour exceller et c'était éclairer rapidement. Je dois encore travailler sur l'optimisation de mon code bcuz Jsoup est assez nouveau pour moi. Merci d'avoir pris le temps de répondre. – Nag