tutorial studio parse example body attribute java html parsing jsoup

java - studio - jsoup select



¿Cómo analizar la tabla HTML usando jsoup? (2)

Lo que haría en su caso es crear primero un Objeto de su máquina con todos los atributos apropiados. Luego, utilizando Jsoup, extraería datos y crearía un ArrayList, y luego utilizaría la lógica para obtener datos del Arraylist.

Me estoy saltando la creación del Objeto (ya que no es el problema aquí) y nombraré el Objeto como Machine

Luego, usando Jsoup obtendría los datos de la fila como este

ArrayList<Machine> 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); } }

Luego use un bucle para obtener los valores que necesita de la lista:

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

Eso es todo. También tenga en cuenta que este código no se ha probado y puede contener algunos errores sintácticos, ya que está escrito directamente en este editor y no en un IDE.

Estoy tratando de analizar HTML usando jsoup. Esta es la primera vez que trabajo con jsoup y también leí algunos tutoriales. A continuación se muestra mi tabla HTML que estoy tratando de analizar -

Si ve mi tabla de abajo, tiene tres tr partir de ahora (lo he acortado para tener tres filas de tablas solo para entender el propósito, pero en general será más). Ahora me gustaría extraer el Cluster Name de mi tabla a continuación y su host name correspondiente, por ejemplo, extraería Titan como nombre de clúster y todos sus nombres de host cuyo estado está inactivo.

Como puede ver a continuación para el nombre del clúster Titan , tengo dos nombres de host machineA.abc.com y machineB.abc.com en los que el estado de machineA está up pero el estado de machineB está down .

Así que imprimiré Titan como nombre de clúster e imprimiré machineB.abc.com como nombre de host ya que está inactivo. ¿Es posible hacer esto usando jsoup?

<table border=1> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>Alert</td> <td>Cluster Name</td> <td>IP addr</td> <td>Host Name</td> <td>Type</td> <td>Status</td> <td>Free</td> <td>Version</td> <td>Restart Time</td> <td>UpTime(Days)</td> <td>Last probed</td> <td>Last up</td> </tr> <tr bgcolor="ffffff"> <td><a href=showlog?ip_addr=127.0.0.1>Hist</a></td> <td><a href=http://127.0.0.1:8080/test?full=y>VI</a></td> <td bgcolor="ffffff">&nbsp</td> <td>Titan</td> <td>10.100.111.77</td> <td>machineA.abc.com</td> <td></td> <td bgcolor="ffffff">up</td> <td bgcolor="ffffff" align=right>88%</td> <td bgcolor="ffffff">2.0.5-SNAPSHOT</td> <td bgcolor="ffffff">2014-07-04 01:49:08,220</td> <td bgcolor="ffffff" align=right>381</td> <td>07-14 20:01:59</td> <td>07-14 20:01:59</td> </tr> <tr bgcolor="ffffff"> <td><a href=showlog?ip_addr=127.0.0.1>Hist</a></td> <td><a href=http://127.0.0.1:8080/test?full=y>VI</a></td> <td bgcolor="ffffff">&nbsp</td> <td></td> <td>10.200.192.99</td> <td>machineB.abc.com</td> <td></td> <td bgcolor="ffffff">down</td> <td bgcolor="ffffff" align=right>85%</td> <td bgcolor="ffffff">2.0.5-SNAPSHOT</td> <td bgcolor="ffffff">2014-07-04 01:52:20,613</td> <td bgcolor="ffffff" align=right>103</td> <td>07-14 20:01:59</td> <td>07-14 20:01:59</td> </tr> </table>

Hasta ahora, puedo extraer una tabla HTML completa utilizando jsoup pero no estoy seguro de cómo extraer el nombre del clúster y los nombres de host que están abajo

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

Actualizar:-

Podría tener dos nombres de cluster en la tabla como se muestra a continuación:

<table border=1> <tr> <td>&nbsp;</td> <td>&nbsp;</td> <td>Alert</td> <td>Cluster Name</td> <td>IP addr</td> <td>Host Name</td> <td>Type</td> <td>Status</td> <td>Free</td> <td>Version</td> <td>Restart Time</td> <td>UpTime(Days)</td> <td>Last probed</td> <td>Last up</td> </tr> <tr bgcolor="ffffff"> <td><a href=showlog?ip_addr=127.0.0.1>Hist</a></td> <td><a href=http://127.0.0.1:8080/test?full=y>VI</a></td> <td bgcolor="ffffff">&nbsp</td> <td>Titan</td> <td>10.100.111.77</td> <td>machineA.abc.com</td> <td></td> <td bgcolor="ffffff">up</td> <td bgcolor="ffffff" align=right>88%</td> <td bgcolor="ffffff">2.0.5-SNAPSHOT</td> <td bgcolor="ffffff">2014-07-04 01:49:08,220</td> <td bgcolor="ffffff" align=right>381</td> <td>07-14 20:01:59</td> <td>07-14 20:01:59</td> </tr> <tr bgcolor="ffffff"> <td><a href=showlog?ip_addr=127.0.0.1>Hist</a></td> <td><a href=http://127.0.0.1:8080/test?full=y>VI</a></td> <td bgcolor="ffffff">&nbsp</td> <td></td> <td>10.200.192.99</td> <td>machineB.abc.com</td> <td></td> <td bgcolor="ffffff">down</td> <td bgcolor="ffffff" align=right>85%</td> <td bgcolor="ffffff">2.0.5-SNAPSHOT</td> <td bgcolor="ffffff">2014-07-04 01:52:20,613</td> <td bgcolor="ffffff" align=right>103</td> <td>07-14 20:01:59</td> <td>07-14 20:01:59</td> </tr> <tr bgcolor="ffffff"> <td><a href=showlog?ip_addr=127.0.0.1>Hist</a></td> <td><a href=http://127.0.0.1:8080/test?full=y>VI</a></td> <td bgcolor="ffffff">&nbsp</td> <td>Goldy</td> <td>10.100.111.77</td> <td>machineH.pqr.com</td> <td></td> <td bgcolor="ffffff">up</td> <td bgcolor="ffffff" align=right>88%</td> <td bgcolor="ffffff">2.0.5-SNAPSHOT</td> <td bgcolor="ffffff">2014-07-04 01:49:08,220</td> <td bgcolor="ffffff" align=right>381</td> <td>07-14 20:01:59</td> <td>07-14 20:01:59</td> </tr> </table>

Ahora, si ve arriba, tengo dos nombres de clúster: uno es Titan y el otro es Goldy así que quiero encontrar todas las máquinas que solo tienen el nombre de clúster de Titan .


Sí, es posible con JSoup. Primero, seleccionas la tabla. A continuación, selecciona las etiquetas <tr> para las filas. Puede comenzar desde el segundo índice ya que la primera fila contiene solo los nombres de columna. Luego recorra las etiquetas <th> y obtenga el índice específico. En su caso, los índices 7 y 5 son importantes (índice 7: Estado, índice 5: Nombre de host). Verifique el estado si es igual a down y si lo es, luego agregue el Nombre de host a una lista. Eso es todo.

ArrayList<String> 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()); } }

Actualización: cuando encuentre la palabra Titan , puede crear otro bucle y ver si el nombre del clúster está vacío.

Editar: cambio el bucle while para do while bucle while.

ArrayList<String> 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 contendrá la lista de nombres de host de servidores inactivos.