programadorvb6 0 Posted March 23, 2011 Report Share Posted March 23, 2011 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 ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé. Link to post Share on other sites
ribeiro55 47 Posted March 23, 2011 Report Share Posted March 23, 2011 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 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" Link to post Share on other sites
jpaulino 90 Posted March 23, 2011 Report Share Posted March 23, 2011 Ou então: Dim xDoc = XDocument.Parse(Bloco_De_Xml_Que_Forneceste) Console.WriteLine(xDoc...<li>.Count) Link to post Share on other sites
Away 0 Posted March 23, 2011 Report Share Posted March 23, 2011 Pois mas ele tem codigo HTML O_O Msgbox("I Help if i can, Hope some day you help me too!") Link to post Share on other sites
bruno1234 19 Posted March 23, 2011 Report Share Posted March 23, 2011 Uma solução simples é recorrer a Regular Expressions e encontrar o número de matches. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos Link to post Share on other sites
Away 0 Posted March 23, 2011 Report Share Posted March 23, 2011 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!") Link to post Share on other sites
jpaulino 90 Posted March 23, 2011 Report Share Posted March 23, 2011 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 Link to post Share on other sites
Away 0 Posted March 23, 2011 Report Share Posted March 23, 2011 Ah Ok , Me.Conhecimento.Added = True Msgbox("Thanks!") Msgbox("I Help if i can, Hope some day you help me too!") Link to post Share on other sites
programadorvb6 0 Posted March 24, 2011 Author Report Share Posted March 24, 2011 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 ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé. Link to post Share on other sites
ribeiro55 47 Posted March 24, 2011 Report Share Posted March 24, 2011 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" Link to post Share on other sites
Away 0 Posted March 24, 2011 Report Share Posted March 24, 2011 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!") Link to post Share on other sites
ribeiro55 47 Posted March 24, 2011 Report Share Posted March 24, 2011 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" Link to post Share on other sites
Away 0 Posted March 24, 2011 Report Share Posted March 24, 2011 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!") Link to post Share on other sites
Rui Carlos 359 Posted March 24, 2011 Report Share Posted March 24, 2011 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. Rui Carlos Gonçalves Link to post Share on other sites
programadorvb6 0 Posted March 24, 2011 Author Report Share Posted March 24, 2011 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 ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé. Link to post Share on other sites
Away 0 Posted March 24, 2011 Report Share Posted March 24, 2011 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!") Link to post Share on other sites
Away 0 Posted March 24, 2011 Report Share Posted March 24, 2011 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!") Link to post Share on other sites
Rechousa 70 Posted March 25, 2011 Report Share Posted March 25, 2011 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 Link to post Share on other sites
programadorvb6 0 Posted March 25, 2011 Author Report Share Posted March 25, 2011 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 ______________________________________________________________________________ Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé. Link to post Share on other sites
Away 0 Posted March 25, 2011 Report Share Posted March 25, 2011 Se funciona EstÀ BOM! Msgbox("I Help if i can, Hope some day you help me too!") Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now