Saltar al contenido

¿Cómo analizar una tabla HTML usando jsoup?

Solución:

Sí, es posible con JSoup. Primero, selecciona la tabla. Luego, selecciona el <tr> etiquetas para filas. Puede comenzar desde el segundo índice, ya que la primera fila contiene solo los nombres de las columnas. Luego recorre el <th> etiquetas y obtenga el índice específico. En su caso, los índices 7 y 5 son importantes (índice 7: Estado, índice 5: Nombre de host). Compruebe el estado si es igual a down y si es así, 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());
    }
}

Actualizar:
Cuando encuentres la palabra Titan puede crear otro bucle y ver si el nombre del clúster está vacío.

Editar: Yo cambio el while bucle a do while círculo.

    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.

Lo que haría en su caso es crear primero un Objeto de su máquina con todos los atributos apropiados. Luego, usando Jsoup, extraería datos y crearía una ArrayList, y luego usaría la lógica para obtener datos de 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 ciclo 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. Tenga en cuenta también 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *