Come analizzare la tabella HTML usando jsoup?

Sto cercando di analizzare HTML usando jsoup. Questa è la mia prima volta che lavoro con jsoup e ho letto anche alcuni tutorial. Di seguito è la mia tabella HTML che sto cercando di analizzare –

Se vedi la mia tabella qui sotto, ha tre tr come ora (l’ho abbreviato per avere tre righe di tabella solo per capire lo scopo ma in generale sarà più). Ora vorrei estrarre il Cluster Name dalla mia tabella sottostante e il suo host name corrispondente, ad esempio, vorrei estrarre Titan come nome del cluster e tutto il suo nome host il cui stato è inattivo.

Come potete vedere qui sotto per il nome del cluster Titan , ho due machineA.abc.com hostname machineA.abc.com e machineB.abc.com in cui lo stato di machineA è machineB ma lo stato di machineB è down .

Quindi stamperò Titan come nome del cluster e machineB.abc.com la machineB.abc.com come nome host dal momento che è inattivo. È ansible farlo con jsoup?

 
    Alert Cluster Name IP addr Host Name Type Status Free Version Restart Time UpTime(Days) Last probed Last up
Hist VI &nbsp Titan 10.100.111.77 machineA.abc.com up 88% 2.0.5-SNAPSHOT 2014-07-04 01:49:08,220 381 07-14 20:01:59 07-14 20:01:59
Hist VI &nbsp 10.200.192.99 machineB.abc.com down 85% 2.0.5-SNAPSHOT 2014-07-04 01:52:20,613 103 07-14 20:01:59 07-14 20:01:59

Finora, sono in grado di estrarre tutta la tabella HTML usando jsoup ma non sono sicuro di come estrarre il nome del cluster e i nomi degli host che sono giù –

 URL url = new URL("url_name"); Document doc = Jsoup.parse(url, 3000); 

Aggiornare:-

Potrei avere due nomi di cluster nella tabella come mostrato di seguito –

 
    Alert Cluster Name IP addr Host Name Type Status Free Version Restart Time UpTime(Days) Last probed Last up
Hist VI &nbsp Titan 10.100.111.77 machineA.abc.com up 88% 2.0.5-SNAPSHOT 2014-07-04 01:49:08,220 381 07-14 20:01:59 07-14 20:01:59
Hist VI &nbsp 10.200.192.99 machineB.abc.com down 85% 2.0.5-SNAPSHOT 2014-07-04 01:52:20,613 103 07-14 20:01:59 07-14 20:01:59
Hist VI &nbsp Goldy 10.100.111.77 machineH.pqr.com up 88% 2.0.5-SNAPSHOT 2014-07-04 01:49:08,220 381 07-14 20:01:59 07-14 20:01:59

Ora, se vedi sopra, ho due nomi di cluster: uno è Titan e l’altro è Goldy quindi voglio trovare tutte le macchine che sono giù solo per il nome del cluster Titan .

Sì, è ansible con JSoup. In primo luogo, si seleziona la tabella. Quindi, si selezionano i tag

per le righe. È ansible iniziare dal secondo indice poiché la prima riga contiene solo i nomi delle colonne. Quindi esegui il loop dei tag

e ottieni l’indice specifico. Nel tuo caso, gli indici 7 e 5 sono importanti (indice 7: stato, indice 5: nome host). Controllare lo stato se è uguale a down e se lo è, quindi aggiungere il nome host a un elenco. È tutto.

 ArrayList downServers = new ArrayList<>(); Element table = doc.select("table").get(0); //select the first table. Elements rows = table.select("tr"); for (int i = 1; i < rows.size(); i++) { //first row is the col names so skip it. Element row = rows.get(i); Elements cols = row.select("td"); if (cols.get(7).text().equals("down")) { downServers.add(cols.get(5).text()); } } 

Aggiornamento: quando trovi la parola Titan puoi creare un altro ciclo e guardare se il nome del cluster è vuoto.

Modifica: cambio il ciclo while da do while loop.

  ArrayList downServers = new ArrayList<>(); Element table = doc.select("table").get(0); //select the first table. Elements rows = table.select("tr"); for (int i = 1; i < rows.size(); i++) { //first row is the col names so skip it. Element row = rows.get(i); Elements cols = row.select("td"); if (cols.get(3).text().equals("Titan")) { if (cols.get(7).text().equals("down")) downServers.add(cols.get(5).text()); do { if(i < rows.size() - 1) i++; row = rows.get(i); cols = row.select("td"); if (cols.get(7).text().equals("down") && cols.get(3).text().equals("")) { downServers.add(cols.get(5).text()); } if(i == rows.size() - 1) break; } while (cols.get(3).text().equals("")); i--; //if there is two Titan names consecutively. } } 

downServers ArrayList conterrà l'elenco dei nomi host dei down server.

Quello che farei nel tuo caso è innanzitutto creare un object della tua macchina con tutti gli attributi appropriati. Quindi usando Jsoup vorrei estrarre i dati e creare un ArrayList, e quindi usare la logica per ottenere i dati dall’array.

Sto saltando la creazione dell’object (dal momento che non è il problema qui) e chiamerò l’object come Machine

Quindi usando Jsoup, otterrei i dati di riga in questo modo:

 ArrayList list = new ArrayList(); Document doc = Jsoup.parse(url, 3000); for (Element table : doc.select("table")) { //this will work if your doc contains only one table element for (Element row : table.select("tr")) { Machine tmp = new Machine(); Elements tds = row.select("td"); tmp.setClusterName(tds.get(3).text()); tmp.setIp(tds.get(4).text()); tmp.setStatus(tds.get(7).text()); //.... and so on for the rest of attributes list.add(tmp); } } 

Quindi utilizza un ciclo per ottenere i valori necessari dall’elenco:

 for(Machine x:list){ if(x.getStatus().equalsIgnoreCase("up")){ //machine with UP status found System.out.println("The Machine with up status is:"+x.getHostName()); } } 

È tutto. Si noti inoltre che questo codice non è stato testato e potrebbe contenere alcuni errori sintattici poiché è scritto direttamente su questo editor e non su un IDE.