Jump to content
programadorvb6

Como saber como quantas linhas se repete : < li > .. </li> ?

Recommended Posts

programadorvb6

Olá Gurus de VB.Net

Tenho este código em html e precisava de saber como posso contar quantas linhas tem : < li > .. </li> ?

Isto tudo porque o site não disponibilizou Rss e só assim consigo saber quantos post novos há.

O Link é este : http://www.montargilforum.com/ncforum/archive/index.php?f-52-p-8.html

O código HTML é este :

<div id="content">
<ol start="1751">
<li>Zona Desportiva de Montargil</li>
<li>Feliz Ano Novo</li>
<li>Delphi: um ano após fecho das portas em Ponte de Sôr!</li>
<li>Esperemos que não seja um mau presságio</li>
<li>Aniversário</li>
<li>Falecimento</li>
<li>Agradecimento</li>
<li>Secretário de Estado da Saúde preside à instalação de UCC’s na ULSNA.</li>
<li>EBI Montargil - Ambiente Positivo</li>
<li>Ciência e Novas Tecnologias - um novo Núcleo da Nova Cultura</li>
<li>Prates Miguel no "5 para a meia noite"</li>
</ol>
</div>

Grato desde já pela vossa atenção.

Atentamente.

Programadorvb6

Share this post


Link to post
Share on other sites
ribeiro55

Podes carregar o XML para um XMLDocument, presumindo que está válido, e apanhar todos os tags "li" de determinado nó.

Por exemplo para apanhar os tags "li" do bloco que forneceste:

       Dim XMLDoc As New Xml.XmlDocument
        XMLDoc.LoadXml(Bloco_De_Xml_Que_Forneceste)

        MsgBox(XMLDoc.GetElementsByTagName("li").Count)

São 11 :confused:


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
jpaulino

Ou então:

        Dim xDoc = XDocument.Parse(Bloco_De_Xml_Que_Forneceste)
        Console.WriteLine(xDoc...<li>.Count)

Share this post


Link to post
Share on other sites
Away

Pois mas ele tem codigo HTML O_O


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
Away

Utilize um WebBrowser com o URL dessa pagina e faça isto no evento Document Completed do webbrowser:

AlgumaCoisa.Text = WebBrowser1.Document.GetElementsByTagName("li").Count

Agora por exemplo se quizeres adicionar o texto de cada um em uma listbox faz isto:

For i = 0 to WebBrowser1.Document.GetElementsByTagName("li").Count -1
Listbox1.Items.Add(WebBrowser1.Document.GetElementsByTagName("li").Item(i).InnerText)
Next


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
jpaulino

Pois mas ele tem codigo HTML O_O

O que ele referiu é que tem aquele código html, e com aquele código, pode muito bem fazer o parse para xml :confused:

Share this post


Link to post
Share on other sites
Away

Ah Ok , Me.Conhecimento.Added = True

Msgbox("Thanks!")


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
programadorvb6

Olá a todos.

Desde já quero agradecer pela vossa a ajuda prestada.

Ainda estou a aprender pelos livros.. é uma questão de tempo.

Indo pelas dicas dadas pelos colaboradores JPaulino e o Ribeiro (Segundo o que entendi) , teria que fazer uma transposição para uma caixa de texto do código HTML e só aí fazia a contagem do referido parametro.

Ficaria uma coisa assim penso eu :

Imports System.Net
Imports System.IO
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim inStream As StreamReader
        Dim webRequest As WebRequest
        Dim webresponse As WebResponse
        webRequest = webRequest.Create(TextBox1.Text)
        webresponse = webRequest.GetResponse()
        inStream = New StreamReader(webresponse.GetResponseStream())
        TextBox2.Text = inStream.ReadToEnd()
    End Sub

End Class

O  que também é uma boa opção, (a meu ver) para conseguir obter mais parametros.

Por fim, temos a opção do colega Away, que poderá ser a mais indicada(para o que pretendo fazer), visto fazer logo a manipulação contida nesses parametros,a pessoa que fez o site não disponibilizou Rss o que faz com que visite as páginas do site em causa regularmente.

Quando terminar disponibilizo o código.

Obrigado a todos os que colaboraram.

Atentamente

Programadorvb6

Share this post


Link to post
Share on other sites
ribeiro55

Pois mas ele tem codigo HTML O_O

Quer seja eXtended, ou HyperText, não deixa de ser Markup Language, e pode ser validado como tal.

Indo pelas dicas dadas pelos colaboradores JPaulino e o Ribeiro (Segundo o que entendi) , teria que fazer uma transposição para uma caixa de texto do código HTML e só aí fazia a contagem do referido parametro.

(...)

Não precisa nem de ser carregado para uma textbox, nem de usar WebRequests.

Alternativamente até o DownloadString te faz o trabalho.

        Dim XMLDoc As New Xml.XmlDocument
        Dim WC As New Net.WebClient
        XMLDoc.LoadXml(WC.DownloadString("www.google.com"))
        MsgBox(XMLDoc.GetElementsByTagName("li").Count)

Por fim, temos a opção do colega Away, que poderá ser a mais indicada(para o que pretendo fazer), visto fazer logo a manipulação contida nesses parametros,a pessoa que fez o site não disponibilizou Rss o que faz com que visite as páginas do site em causa regularmente.

Que é exactamente a mesma coisa e tem exactamente as mesmas possibilidades ;)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Away

ribeiro obrigado pela informação,Mas eu tentei usar o seu codigo e nao deu, Deu erro =/


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
ribeiro55

Que erro, já agora?

Aqui funciona bem.

Tenta por exemplo com o site da Microsoft

        Dim XMLDoc As New Xml.XmlDocument
        Dim WC As New Net.WebClient
        XMLDoc.LoadXml(WC.DownloadString("http://www.microsoft.com"))
        MsgBox(XMLDoc.GetElementsByTagName("li").Count)

O que lá meti foi para exemplo. Falta o protocolo (http://).

Para além disso, o markup do google.com não está válido, de acordo com as especificações da Microsoft.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Away

Esse nao testei, Foi o anterior e deu isso : "Data at the root level is invalid. Line 1, position 1."

Mas esse funcionou..


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
Rui Carlos

Quer seja eXtended, ou HyperText, não deixa de ser Markup Language, e pode ser validado como tal.

Pois, mas HTML não tem que ser XML válido. Pessoalmente, tento usar sempre xHTML, mas uma das razões para se recomendar HTML em vez de xHTML é que os parsers HTML são mais tolerantes a erros do que os parsers xHTML.

Não sei como é que funcionam os parsers do VB.NET, mas muitos parsers XML falham ao carregar documentos HTML que não sejam também documentos XML válidos (a documentação do método dá a entender que só funciona com XML válido).

E a tag li é precisamente uma das que pode dar problemas, visto não ser obrigatório fechar a tag, embora tendo por base o HTML do primeiro post, não deve haver problema.

Share this post


Link to post
Share on other sites
programadorvb6

Olá a todos.

Desde já quero agradecer novamente pela vossa paciência e também pela vossa prestável colaboração.

Deixo então aqui uma imagem para terem uma ideia do que se trata, bem como parte do código.

http://img5.imageshack.us/img5/5495/imagemrc.jpg

Código

Public Class KeyKeeper
   Dim Escolha As Long

   Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
       Dim i As Integer
       If Escolha = 1 Then
           If Me.WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
               For i = 0 To WebBrowser1.document.GetElementsByTagName("li").Count - 1
                   ListBox1.Items.Add(WebBrowser1.document.GetElementsByTagName("li").Item(i).InnerText)
               Next
           End If
           MsgBox("Total de Notícias  : " & Me.ListBox1.Items.Count)
           Escolha = 0
           Exit Sub
       End If
       If Escolha = 2 Then
           If Me.WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
               WebBrowser1.document.GetElementById("vb_login_username").SetAttribute("value", Me.TextBox1.Text)
               WebBrowser1.document.GetElementById("vb_login_password").SetAttribute("value", Me.TextBox2.Text)
               WebBrowser1.document.GetElementById("vb_login_password").Focus() ' Porque o butão nao tem ID por isso "FóCO" nele
               SendKeys.SendWait(Chr(13))
               Escolha = 0
               Exit Sub
           End If
       End If
   End Sub

   Private Sub PFrente_Click(sender As System.Object, e As System.EventArgs) Handles PFrente.Click
       Dim Voltas As ULong
       Dim Ligacao As String
       Voltas = 0

       If Voltas <= 8 Then
           Voltas = Val(Numero.Text) + 1

           Ligacao = "http://www.montargilforum.com/ncforum/archive/index.php?f-52.html"
           Ligacao = Ligacao.Insert(60, "-p-" & Voltas)
           WebBrowser1.Navigate(Ligacao)
           Escolha = 1
           Numero.Text = Voltas
       Else
           Exit Sub
       End If

   End Sub

End Class

Neste código já consegui com que seja feita a leitura de uma só página de cada vez, mas necessito realmente é que seja feita uma leitura total de 8 páginas ao pressionar o botão: PFrente.

O problema que se coloca é como conseguir fazer com que seja lida a totalidade das 8 páginas, com um parametro : < For I=0 to 8 ... > ou outro.

Já tentei fazer, mas não se consegui com que o ciclo < For > espere pelo térmito da leitura de uma página para voltar a fazer novamente o mesmo procedimento de contagem do parâmetro < li >.

Alguém sabe como posso contornar esta situação ?

Obrigado a todos vós pela vossa atenção.

Atentamente.

Programadorvb6

Share this post


Link to post
Share on other sites
Away

Tentei pegar os "li"'s em geral no div "content" mas pelos vistos só pagina por pagina..


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
Away

Tens que fazer algo do genero:

Depois da função de pegar os lis faz:

WebBrowser1.Navigate("http://www.montargilforum.com/ncforum/archive/index.php?f-52-p-2.html") ' Pagina 2
FuncaoDePegarOsLis()
WebBrowser1.Navigate("http://www.montargilforum.com/ncforum/archive/index.php?f-52-p-3.html") ' Pagina 3
FuncaoDePegarOsLis()

Qualquer coisa do genero pelo que vejo é a unica forma..

Cada pagina só muda o numero antes do .html ..


Msgbox("I Help if i can, Hope some day you help me too!")

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Para tratamento do HTML eu uso o HTML Agility Pack - http://htmlagilitypack.codeplex.com/

Rapidamente consegues aceder aos elementos usando XPath, exemplo (terás de adaptar ao teu código):

HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
    HtmlAttribute att = link["href"];
    att.Value = FixLink(att);
}

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
programadorvb6

Olá + 1 vez.

Tentei fazer assim, embora não seja um processo normal para quem é programador de raiz, este código está um pouco menos 'elegante'.. , mas está a funcionar...

Se souberem como fazer uma melhor estroturação do mesmo agradecia.

Public Class KeyKeeper
    Dim Escolha As Long
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        'Carregamento de Página inicial de notícias
        WebBrowser1.Navigate("http://www.montargilforum.com/ncforum/archive/index.php?f-52.html")
        'Escolha = 1
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        'Carregamento de Página inicial para login
        WebBrowser1.Navigate("http://www.montargilforum.com/ncforum/forumdisplay.php?f=44")
        Escolha = 2
    End Sub

    'Checa se o utilizador pretende ver a Pass.
    Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.CheckState = 0 Then
            TextBox2.UseSystemPasswordChar = True
        End If
        If CheckBox1.CheckState = 1 Then
            TextBox2.UseSystemPasswordChar = False
        End If

    End Sub
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim i As Integer

        If Escolha = 1 Then
            If Me.WebBrowser1.ReadyState = WebBrowserReadyState.Complete = True Then
                For i = 0 To WebBrowser1.Document.GetElementsByTagName("li").Count - 1
                    ListBox1.Items.Add(WebBrowser1.Document.GetElementsByTagName("li").Item(i).InnerText)
                Next
            End If
            Escolha = 0
            Exit Sub
        End If
        If Escolha = 2 Then
            If Me.WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
                WebBrowser1.Document.GetElementById("vb_login_username").SetAttribute("value", Me.TextBox1.Text)
                WebBrowser1.Document.GetElementById("vb_login_password").SetAttribute("value", Me.TextBox2.Text)
                WebBrowser1.Document.GetElementById("vb_login_password").Focus() ' Porque o butão nao tem ID por isso "FóCO" nele
                SendKeys.SendWait(Chr(13))
                Escolha = 0
                Exit Sub
            End If
        End If
    End Sub

    Private Sub PNoticias_Click(sender As System.Object, e As System.EventArgs) Handles PNoticias.Click
        MarcaPaginas(8)
    End Sub

    Private Sub TNoticias_Click(sender As System.Object, e As System.EventArgs) Handles TNoticias.Click
        Dim iloop As Integer
        For iloop = 1 To 8
            PNoticias.PerformClick()
            EsperaUmPouco(10)
            Application.DoEvents()
        Next

        If Val(Numero.Text) = 8 Then
            MsgBox("Total de Notícias : " & Me.ListBox1.Items.Count)
        End If
    End Sub
    Public Function MarcaPaginas(ByRef Pag As ULong)

        Dim Voltas As ULong
        Dim Ligacao As String
        Voltas = 0

        If Voltas <= Pag Then
            Voltas = Val(Numero.Text) + 1

            Ligacao = "http://www.montargilforum.com/ncforum/archive/index.php?f-52.html"
            Ligacao = Ligacao.Insert(60, "-p-" & Voltas)
            WebBrowser1.Navigate(Ligacao)
            Escolha = 1
            Numero.Text = Voltas
        Else
            MarcaPaginas = Nothing
            Exit Function
        End If
        MarcaPaginas = Nothing
    End Function
    Sub EsperaUmPouco(ByVal dblSecs As Double)

        Const UmSeg As Double = 1.0# / (1440.0# * 60.0#)
        Dim dblEsperarAte As Date

        Now.AddSeconds(UmSeg)
        dblEsperarAte = Now.AddSeconds(UmSeg).AddSeconds(dblSecs)
        Do Until Now > dblEsperarAte
            Application.DoEvents() 'permite que mensagens sejam processadas
        Loop
    End Sub

End Class

Grato desde já pela vossa atenção.

Atentamente

Programadorvb6

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.