elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Leer datos de una tabla html
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Leer datos de una tabla html  (Leído 9,438 veces)
okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Leer datos de una tabla html
« en: 13 Junio 2015, 13:26 pm »

Hola buenas,

Necesito obtener estos datos y de forma ordenada, en el mismo orden de la tabla.

Por ejemplo tengo esta tabla (que he simplificado):
Código
  1. <div id="contenedor-portadilla">
  2. <table class="TablaPaises" id="calsificacion_completa">
  3. <tr class="Estadistica">
  4. <th colspan="2" class="sinfondo">&nbsp;</th>
  5. <th colspan="1">Totales</th>
  6. </tr>
  7. <td class="Num">1</td>
  8. <td class="Pais">España</td>
  9. </tr>
  10. <tr>
  11. <td class="Num">2</td>
  12. <td class="Pais">Portugal</td>
  13. </tr>

Quedaría así:

    Totales
1 España
2 Portugal


Lo he intentado cargando la página en  webbrowser y usando webbrowser.document ... y sus propiedades, el tagname, y eso pero solo he conseguido un listado del <td> sin ningún orden y todo mezclado.

yo quiero poder conseguir los datos a voluntad para mostrarlo en un ListView

 
Agradezco cualquier ayuda.

Sl2





« Última modificación: 19 Junio 2015, 03:38 am por okik » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Leer datos de una tabla html
« Respuesta #1 en: 13 Junio 2015, 14:30 pm »

Ve analizando la tabla. Buscas las etiquetas tr. Dentro de las tr, localizas las td. Al localizar las td, coges el contenido. Y así con todas las columnas. Basta ir comparando hasta encontrar la cadena deseada (teniendo cuidado de no buscar dentro de comillas).


En línea

fran800m

Desconectado Desconectado

Mensajes: 204



Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #2 en: 13 Junio 2015, 14:47 pm »

Si la respuesta es XHMTL lo más fácil puede ser cargarlo como XmlDocument (creo que se llamaba así la clase) y mediante XPath obtener los nodos td

Si el resultado los cargas en un List (o Array), no recuerdo ahora puedes usar el método Sort para ordenar.

Un saludo,
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #3 en: 13 Junio 2015, 17:10 pm »

Un método eficiente para parsear un documento HTML es haciendo uso de la librería (gratuita) profesional HtmlAgilityPack, esta se basa en la utilización de expresiones XPATH.

En este ejemplo creo una (simple) Class llamada RowData que servirá para mantener una colección rehutilizable con los datos obtenidos de la tabla:

Código
  1. Imports HtmlAgilityPack
  2.  
  3. Public Class Form1
  4.  
  5.    Dim htmlCode As XElement =
  6.    <html>
  7.        <div id="contenedor-portadilla">
  8.            <table class="TablaPaises" id="calsificacion_completa">
  9.                <thead>
  10.                    <tr class="Estadistica">
  11.                        <th colspan="2" class="sinfondo"></th>
  12.                        <th colspan="1">Totales</th>
  13.                    </tr>
  14.                </thead>
  15.                <tbody>
  16.                    <tr>
  17.                        <td class="Num">1</td>
  18.                        <td class="Pais">España</td>
  19.                    </tr>
  20.                    <tr>
  21.                        <td class="Num">2</td>
  22.                        <td class="Pais">Portugal</td>
  23.                    </tr>
  24.                </tbody>
  25.            </table>
  26.        </div>
  27.    </html>
  28.  
  29.    Public Class RowData
  30.        Public Property Index As Integer
  31.        Public Property Country As String
  32.    End Class
  33.  
  34.    Private Sub Test() Handles MyBase.Load
  35.  
  36.        Dim doc As New HtmlDocument
  37.        doc.LoadHtml(htmlCode.ToString)
  38.  
  39.        Dim tColumnName As String =
  40.            doc.DocumentNode.SelectSingleNode(".//table[@class='TablaPaises']/thead/tr[@class='Estadistica']/th[@colspan='1']").InnerText
  41.  
  42.        Dim tRows As IEnumerable(Of RowData) =
  43.            From node As HtmlNode In doc.DocumentNode.SelectNodes(".//table[@class='TablaPaises']/tbody/tr")
  44.                   Select New RowData With
  45.                          {
  46.                              .Index = CInt(node.SelectSingleNode(".//td[@class='Num']").InnerText),
  47.                              .Country = node.SelectSingleNode(".//td[@class='Pais']").InnerText.Trim(" "c)
  48.                          }
  49.  
  50.        For Each row As RowData In tRows
  51.            Debug.WriteLine(String.Format("Num: {0}, País: {1}", CStr(row.Index), row.Country))
  52.        Next row
  53.  
  54.    End Sub
  55.  
  56. End Class

De todas formas, cómo te ha comentado @fran800m puedes parsear un objeto de tipo XElement (o XDocument), puedes utilizar una sintaxis parecida a esta:

Código
  1. Dim value As String = htmlCode.<Nombre De Elemento 1>.<Nombre De Elemento 2>.<etc...>.<@Nombre de Atributo>.Value

También puedes usar las funciones built-in de dicha Class XElement para buscar descendientes, ancestros, enumerar las expresiones XPATH disponibles, etc.

Saludos!
« Última modificación: 13 Junio 2015, 20:47 pm por Eleкtro » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #4 en: 16 Junio 2015, 13:20 pm »

Cuantas respuestas, muchas gracias  :D

Estos días he tenido problemas con la compu, concrectamente con la concexión a Internet (estuve haciendo cosas raras...), pero ya está arreglado. A causa de ello no he podido ver vuestras respuestas. Las vi ayer, pero he estado terminando de recuperar el sistema.

Ahora probaré el código de Elektro, a ver que tal.

Sl2
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #5 en: 17 Junio 2015, 13:24 pm »

De nuevo gracias por las respuestas.

Me he descargado Html Agility Pack, pero antes de usarlo he buscado la forma de no depender de librerías externas. He encontrado esta forma usando System.Windows.Forms.HtmlDocument y algo tan viejo como la función InStr.

Antes de usar Instr es obtener las líneas <td class="Pais">*</td> mediante miembro OuterHtml de HtmlElement, luego mediante Instr determinar si estamos en "Num" o "Pais" y en cuyo caso se obtiene el InnerText, que sería el número o país.


Código
  1.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.        Dim doc As HtmlDocument = WebBrowser1.Document
  3.        Dim divs As HtmlElementCollection = doc.GetElementsByTagName("div")
  4.  
  5.        Dim Tipo As String
  6.        Label1.Text = ""
  7.  
  8.        For Each div As HtmlElement In divs
  9.            If div.GetAttribute("id") = "contenedor-portadilla" Then
  10.                Dim tables As HtmlElementCollection = doc.GetElementsByTagName("table")
  11.                For Each table As HtmlElement In tables
  12.                    Dim tds As HtmlElementCollection = table.GetElementsByTagName("td")
  13.                    Dim tdText As String = String.Empty
  14.                    For Each td As HtmlElement In tds
  15.                        tdText = td.InnerText
  16.                        Tipo = td.OuterHtml
  17.  
  18.                        'Obtiene la columna "num"
  19.                        ' If InStr(Tipo, "num", CompareMethod.Text) > 0 Then
  20.                        '  Label1.Text = Label1.Text & tdText & vbCrLf
  21.                        '  End If
  22.  
  23.                        'Obtiene la columna "pais"
  24.                        If InStr(Tipo, "Pais", CompareMethod.Text) > 0 Then
  25.                            Label1.Text = Label1.Text & tdText & vbCrLf
  26.                        End If
  27.                    Next
  28.  
  29.                    'Obtiene la cabezera "Totales"
  30.                    Dim ths As HtmlElementCollection = table.GetElementsByTagName("th")
  31.  
  32.                    Dim thText As String = String.Empty
  33.                    For Each th As HtmlElement In ths
  34.                        thText = th.InnerText
  35.                        Label1.Text = Label1.Text & thText & vbCrLf
  36.                    Next
  37.                Next
  38.            End If
  39.        Next
  40.    End Sub

Ignoraba que hacer esto se llama "parsear html", este termino me ha venido muy bien a la hora de buscar en la red sobre este tema y he encontrado otras formas que más adelante probaré. 


Sl2
     
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #6 en: 17 Junio 2015, 15:32 pm »

He encontrado esta forma usando System.Windows.Forms.HtmlDocument y algo tan viejo como la función InStr.

El código que has mostrado está bastante vb6-estilizado.

En lugar de la función InStr, puedes utilizar la función String.IndexOf()

En lugar de la constante vbCrLf, puedes usar la constante ControlChars.CrLf

Saludos!
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #7 en: 18 Junio 2015, 19:13 pm »

El código que has mostrado está bastante vb6-estilizado.

En lugar de la función InStr, puedes utilizar la función String.IndexOf()

En lugar de la constante vbCrLf, puedes usar la constante ControlChars.CrLf

Saludos!

Gracias elektro, por la información. No sabía lo de ControlChars.Crlf, pero si uso vbCrlf ¿tampoco pasa nada no?. Quiero decir, que no afecta en nada al programa, supongo. Es más, se me ocurre que también se podría usar ChrW(13).

En cuanto a lo de String.IndexOf, eso si que lo sabía. Ahora me doy cuenta que también sirve  :P
« Última modificación: 18 Junio 2015, 19:16 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #8 en: 18 Junio 2015, 21:55 pm »

Citar
Es más, se me ocurre que también se podría usar ChrW(13).

El mismo "error" de nuevo. puedes utilizar la función Convert.ToChar.

pero si uso vbCrlf ¿tampoco pasa nada no?. Quiero decir, que no afecta en nada al programa, supongo.

No, en realidad no pasa nada ...o según se mire,
los wrappers de vb6 siguen siendo puro código .Net, pero la razón de que existan es por compatibilidad, esto quiere decir que un buen día podrían dejar de existir,

pero, yo te lo comento más que nada por que simplemente el hecho de recurrir a las viejas técnicas o nombres de funciones de VB6 no es algo bueno ya que de alguna manera te estancas en esa tecnología de hace ya casi 2 décadas, y entonces no sigues buenas prácticas de programación en .Net, ya que esto es .Net, no VB6,

y, aunque de todas formas sea puro código .Net cómo ya he dicho, si vieras el código fuente de esos wrappers (mediante Reflection) es bastante horrible en comparación con el resto de sus equivalentes funciones built-in que no forman parte del namespace Microsoft.VisualBasic,
por ende, te recomiendo no utilizar practicamente ningún miembro que forme parte del namespace Microsoft.VisualBasic, es decir, ningún nombre de función que conozcas de Vb6 plus las constantes y todo eso, ya que todo tiene su equivalente en otras clases más "seguras" y optimizadas de .Net.

PD: En mi opinión, es una mala costumbre que les pasa a muchas personas, bien por que hacen la transición de vb6 a .net y preservan sus costumbres, o también a iniciados en VB.Net que hacen copy/pastes de Google, ya que en la mayoría de respuestas que encuentres en Google solo verás morralla vb6-estilizada de programadores que siguen este tipo de prácticas con VB.Net.

Saludos!
« Última modificación: 18 Junio 2015, 22:07 pm por Eleкtro » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Leer datos de una tabla html
« Respuesta #9 en: 19 Junio 2015, 03:33 am »

Bien Elektro, seguiré tu consejo.

Al final he encontrado una manera más elegante de obtener el listado de la tabla. Curiosamente al intentar ayudar a otro usuario que trata de loguear y accionar un botón de una web. Antes intentaba encontrar conseguir el atributo "class" y no funcionaba, pues resulta que se llama usando el término "classname".


Código
  1.  
  2. Dim doc As HtmlDocument = WebBrowser1.Document
  3.        Dim divs As HtmlElementCollection = doc.GetElementsByTagName("td")
  4.        For Each div As HtmlElement In divs
  5.            If div.GetAttribute("classname") = "Pais" Then
  6.                ListBox1.Items.Add(div.InnerText)
  7.            End If
  8.        Next


y otra forma, esta. Pero solo obtiene el primero, porque no repasa cada elemento

Código
  1.     Dim ele = webbrowser1.Document.GetElementsByTagName("td").Cast(Of HtmlElement).First(Function(el) el.GetAttribute("classname") = "Pais")
  2.        ListBox1.Items.Add(ele.InnerText)

y aunque en el ejemplo uso el control Webbrowser1 se puede crear una variable objeto como un webbrowser



« Última modificación: 19 Junio 2015, 03:37 am por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Organizar Tabla HTML
PHP
^Tifa^ 4 3,408 Último mensaje 26 Abril 2009, 22:44 pm
por дٳŦ٭
extraer html (tabla) con php
PHP
schumacher 2 4,177 Último mensaje 25 Mayo 2012, 07:37 am
por engel lex
python y tabla HTML
Scripting
Alfai 3 4,477 Último mensaje 17 Agosto 2009, 00:04 am
por Alfai
Duda sobre insersion a tabla html desde tabla sql
Bases de Datos
mokoMonster 2 3,946 Último mensaje 20 Febrero 2010, 01:20 am
por Shell Root
Html leer datos
Desarrollo Web
DameBanda 5 4,830 Último mensaje 16 Noviembre 2011, 16:58 pm
por RyogiShiki
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines