Obtener datos de la sbs

Iniciado por dany22_, 3 Julio 2015, 16:12 PM

0 Miembros y 1 Visitante están viendo este tema.

dany22_

Estimados amigos muy buenos dias, quisiera que por favor me ayuden a que este codigo funcione. Lo que pretendo es extraer datos de esta pagina de la sbs. http://www.sbs.gob.pe/app/spp/Afiliados/afil_detalle.asp?tp=2&tip_doc=00&num_doc=00000000



Imports System.Collections.Generic

Imports System.Linq
Imports System.Net
Imports HtmlAgilityPack
Imports System.Text.RegularExpressions
Imports System.IO
Imports System.Web
Public Class Form2
   
    Sub obtener()
        Try
            Dim document As HtmlAgilityPack.HtmlDocument = New HtmlAgilityPack.HtmlDocument()
            document.LoadHtml("http://www.sbs.gob.pe/app/spp/Afiliados/afil_detalle.asp?tp=2&tip_doc=00&num_doc=00000000")
            Dim NodesTr As HtmlAgilityPack.HtmlNodeCollection = document.DocumentNode.SelectNodes("//table[@id='TblDetalle']//tr")
            If NodesTr IsNot Nothing Then
                Dim dt As New DataTable()
                dt.Columns.Add("DATO1", GetType(String))
                dt.Columns.Add("DATO2", GetType(String))

                Dim iNumFila As Integer = 0
                For Each Node As HtmlNode In NodesTr
                    If iNumFila > 0 Then
                        Dim iNumColumna As Integer = 0
                        Dim dr As DataRow = dt.NewRow()
                        For Each subNode As HtmlNode In Node.Elements("td")
                            If (iNumColumna = 0) Then dr = dt.NewRow()
                            Dim sValue As String = subNode.InnerHtml.ToString().Trim()
                            sValue = System.Text.RegularExpressions.Regex.Replace(sValue, "<.*?>", " ")
                            dr(iNumColumna) = sValue
                            iNumColumna += 1
                            If iNumColumna = 2 Then '3
                                dt.Rows.Add(dr)
                                iNumColumna = 0
                            End If
                        Next
                    End If
                    iNumFila += 1
                Next
                dt.AcceptChanges()
                Me.dgvHtml.DataSource = dt
                Me.dgvHtml.ReadOnly = True
                Me.dgvHtml.Columns(0).HeaderText = "DATO1"
                Me.dgvHtml.Columns(1).HeaderText = "DATO2"
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
   
   
End Class

Spectatorem

Que problemas tienes actualmente?

dany22_

#2
No consigo obtener el codigo fuente de la pagina en mension. Reemplazando el 00000000 por un numero de dni valido me deberia arrojar los datos del afiliado y ese codigo es que deberia obtener pero nada

Spectatorem

Yo creo que primero debes mandar la peticion, el resultado de la peticion colocar en tu objeto HtmlAgilityPack y ahí recien procesar lo que quieres.

dany22_

No entiendo muy bien lo que quieres decir, lo que pasa es que no se mucho sobre esto de hecho este codigo es un ejemplo que obtuve buscando en internet.

Spectatorem

Cita de: dany22_ en  3 Julio 2015, 16:43 PM
No entiendo muy bien lo que quieres decir, lo que pasa es que no se mucho sobre esto de hecho este codigo es un ejemplo que obtuve buscando en internet.
Que antes de procesar un html, debes tenerlo mediante una peticion mira esta clase

http://htmlagilitypack.codeplex.com/SourceControl/latest#Branches/2.0.Experimental/HtmlAgilityPack/HtmlWeb.cs

dany22_

Ok le voy a dar una revisada y te aviso si consegui algo

Spectatorem

Cita de: dany22_ en  3 Julio 2015, 16:59 PM
Ok le voy a dar una revisada y te aviso si consegui algo

Perfecto.

dany22_

tambien tengo este codigo quizas es a lo que te refieres

Imports System.Collections.Generic
Imports System.Linq
Imports System.Net
Imports HtmlAgilityPack
Imports System.Text.RegularExpressions
Imports System.IO
Imports System.Web
Public Class Form2
    Dim doc2 As New HtmlAgilityPack.HtmlDocument()
    Dim wc As New WebClient
    Dim regexTrim As New Regex("\s\s", RegexOptions.Compiled)
    Private bConsultado As Boolean = False
    Private bResultado As Boolean = False
    Private sHtml As String = ""
    Private periodo As String = ""

 
    Public Function Consultar(ByVal dni As String) As resultados
        Dim elemento As HtmlNode
        Dim tablaStr As String
x:
        Dim bytes As Byte()
        bytes = wc.DownloadData("http://www.sbs.gob.pe/app/spp/Afiliados/afil_detalle.asp?tp=2&tip_doc=00&num_doc=" & dni)
        Using sr As New StreamReader(New MemoryStream(bytes))
            doc2.LoadHtml(HttpUtility.HtmlDecode(sr.ReadToEnd()))
        End Using
        elemento = doc2.DocumentNode.SelectSingleNode("//html")
        If elemento Is Nothing Then
            GoTo x
        End If
        ' posible bucle infinito
        tablaStr = elemento.InnerHtml
        MsgBox(tablaStr)
        ' posible bucle infinito (poco probable)
        Dim result As New resultados()
        If tablaStr.Contains("Documento de Identidad no registrado en el SPP.") Then
            result.Estado = resultados.RucState.NoExiste
            Return result
        End If

        ' nombre comercial
        result.EstadoContribuyente = ObtenerContenido(elemento, "Apellido Paterno")
        ' estado del contribuyente
        result.CondiciónContribuyente = ObtenerContenido(elemento, "Primer Nombre")
        ' condición del contribuyente
        result.Dirección = ObtenerContenido(elemento, " Fecha Nacimiento")
        ' dirección
        Return result
    End Function
    Private Function ObtenerContenido(tabla As HtmlNode, index As String) As String
        Dim elemento As HtmlNode = Nothing

        For Each e As HtmlNode In tabla.ChildNodes
            If Not String.IsNullOrEmpty(e.InnerText) AndAlso e.InnerText.Contains(index) Then
                elemento = e
                Exit For
            End If
        Next

        If elemento Is Nothing OrElse elemento.ChildNodes.Count = 0 Then
            Return String.Empty
        End If
        Return TrimAll(elemento.ChildNodes(3).InnerText)
    End Function
    Private Function TrimAll(str As String) As String
        While regexTrim.IsMatch(str)
            str = regexTrim.Replace(str, " ")
        End While

        Return str.Trim()
    End Function
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim result As resultados = Consultar("06454380")

        Select Case result.Estado
            Case resultados.RucState.NoExiste
                MessageBox.Show("El RUC no existe.")
            Case resultados.RucState.Normal
                TextBox1.Text = "Número de RUC: " & result.RUC & vbNewLine &
                                        "Tipo Contribuyente: " & result.TipoContribuyente & vbNewLine &
                                        "Tipo de Documento: " & result.TipoDocumento
        End Select

    End Sub
End Class
Public Class resultados

    Public Estado As RucState
    Public RUC As String
    Public TipoContribuyente As String
    Public TipoDocumento As String
    Public NombreComercial As String
    Public EstadoContribuyente As String
    Public CondiciónContribuyente As String
    Public Dirección As String

    Public Enum RucState
        Normal
        NoExiste
    End Enum
End Class

Spectatorem

Ese me hace mas sentido, no te funciona ese?