none
Pegar Texto de uma linha de um html e colocar em um textbox RRS feed

  • Pergunta

  • Boa Noite Pessoal,

    Estou fazendo uma rotina em vb.net, e gostaria de pegar uma linha de uma pagina web, por exemplo essa linha abaixo,

    <h3 id="dia-topo">Domingo, 30 de julho de 2017</h3>

    mas gostaria de colocar somente o que esta dentro >Domingo, 30 de julho de 2017<, e depois deixar somente o dia na text box, isso e possivel mas não achei na net como fazer isso, achei varios coisas sobre html, ler a pagina, pegar os links da pagina, mas pegar uma linha especifica como essa acima não consegui, alguem tem uma ideia de como fazer isso.

    Desde já agradeço muito.

    Pablo Sousa


    PabloSousa

    domingo, 30 de julho de 2017 23:12

Respostas

  • Acho que agora sim:

            Dim wc As New WebClient()
            Dim conteudo As String = wc.DownloadString("http://www.horariodebrasilia.org/") ' aqui não achei erro no caminho???
            Dim doc As New HtmlDocument()
            doc.LoadHtml(conteudo)
            Dim text As String = doc.DocumentNode.SelectSingleNode("//h3[@id='dia-topo']").InnerText

    Não estava num PC com Visual Studio, foi mal.

    Duas coisas:

    Não rolou com o Serializer mesmo, estou usando o HTMLAgilityPackage mesmo que é bem melhor pra esse tipo de tarefa. Instala ele no seu projeto via Nugget, aí é só usar (Install-Package HtmlAgilityPack).


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    segunda-feira, 31 de julho de 2017 02:38
  • Boa Noite Pessoal,

    Consegui resolver o problema acima, dessa forma abaixo, simples de tudo.

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            ' pega linha do html 
            Me.TextBox1.Text = WebBrowser1.Document.GetElementById("dia-topo").InnerText & " - " & WebBrowser1.Document.GetElementById("relogio").InnerText
    
    
        End Sub

    para quem estiver procurando esse codigo funciona bem.

    Pablo Sousa.


    PabloSousa

    • Marcado como Resposta Pablo_1977 terça-feira, 8 de agosto de 2017 03:08
    terça-feira, 8 de agosto de 2017 03:08

Todas as Respostas

  • Pablo,

    Se você usar XmlSerializer e tratar o documento HTML como um XML (que ele é estruturalmente) vai funcionar se usar com esse trecho:

    XmlDocument doc = new XmlDocument();

    doc.Load("Caminho do seu documento");

    var text = doc.SelectSingleNode("//div[@id='dia-topo']").InnerText;

    Porém sugiro usar esse componente aqui (http://html-agility-pack.net/?z=codeplex) que já tem uns utilitários pra trabalhar com HTML mesmo:

    var doc = new HtmlDocument();
    doc.Load(filePath);

    doc.DocumentNode .SelectNodes("//div[@id='dia-topo']").InnerText


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    domingo, 30 de julho de 2017 23:55
  • Boa Noite Rafael,

    Vou fazer o teste no codigo, mas esse codigo que você deu exemplo e c#, estou fazendo em vb.net, tentei converter mas não deu???

    Desde já agradeço, muito obrigado.

    Pablo Sousa.


    PabloSousa

    segunda-feira, 31 de julho de 2017 01:10
  • Foi mal, não vi que era VB:

    Dim doc As New XmlDocument()

    doc.Load("Caminho do seu documento")

    Dim text As String = doc.SelectSingleNode("//div[@id='dia-topo']").InnerText



    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    segunda-feira, 31 de julho de 2017 01:18
  • Boa Noite Rafael,

    Rafael fiz o teste aqui e deu um erro, O caractere ';', valor hexadecimal 0x3B, não pode ser incluído em um nome. Linha 12, posição 11046.

    Caminho do documento e a url do site???

    fiz assim e deu erro,

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim doc As New XmlDocument()
    
            doc.Load("http://www.horariodebrasilia.org")
    
            Dim text As String = doc.SelectSingleNode("//div[@id='dia-topo']").InnerText
    
            Me.TextBox1.Text = text
    
        End Sub
    Desde já agradeço atenção, muito obrigado.


    PabloSousa

    segunda-feira, 31 de julho de 2017 01:34
  • Não não, nesse caso o caminho do documento seria um caminho na sua máquina mesmo, pra pegar do site vai precisar uma outra classe, a WebClient:

    Dim wc as new WebClient()

    Dim conteudo As String = wc.DownloadString("URL do site)

    doc.Load(conteudo)

    Se o site tiver um HTML redondo vai funcionar, caso contrário vai precisar do AgitlityPack, a sintaxe dele é bem parecida com o XmlDocument, acho que ele já tem até uns métodos pra buscar o HTML direto de um site (aí nem precisaria do webClient).


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    segunda-feira, 31 de julho de 2017 01:46
  • Boa Noite Rafael,

    Obrigado pela ajuda, mas deu erro novamente,  doc.Load(conteudo) ' erro aqui  "Caracteres inválidos no caminho."

    rafael não entendi, segue abaixo o codigo,

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim wc As New WebClient()
            Dim conteudo As String = wc.DownloadString("http://www.horariodebrasilia.org/") ' aqui não achei erro no caminho???
            Dim doc As New XmlDocument()
            doc.Load(conteudo) ' erro aqui  "Caracteres inválidos no caminho."
            Dim text As String = doc.SelectSingleNode("//div[@id='dia-topo']").InnerText
            Me.TextBox1.Text = text
    
        End Sub

    Desde já agradeço, muito obrigado.

    Pablo Sousa


    PabloSousa

    segunda-feira, 31 de julho de 2017 02:19
  • Acho que agora sim:

            Dim wc As New WebClient()
            Dim conteudo As String = wc.DownloadString("http://www.horariodebrasilia.org/") ' aqui não achei erro no caminho???
            Dim doc As New HtmlDocument()
            doc.LoadHtml(conteudo)
            Dim text As String = doc.DocumentNode.SelectSingleNode("//h3[@id='dia-topo']").InnerText

    Não estava num PC com Visual Studio, foi mal.

    Duas coisas:

    Não rolou com o Serializer mesmo, estou usando o HTMLAgilityPackage mesmo que é bem melhor pra esse tipo de tarefa. Instala ele no seu projeto via Nugget, aí é só usar (Install-Package HtmlAgilityPack).


    ​Rafael Esquiçato Professional Scrum Master MCP, MCTS

    segunda-feira, 31 de julho de 2017 02:38
  • Bom Dia Rafael,

    Vou fazer os teste depois falo pra ti.

    Desde já agradeço demais atenção e ajuda.

    Muito Obrigado.

    Pablo Sousa.


    PabloSousa

    segunda-feira, 31 de julho de 2017 13:47
  • Boa Tarde Rafael!!!

    Obrigado pela ajuda que tens dado, mas não consegui fazer desse jeito que você falou, tenho um codigo aqui que peguei no site do dinossauro do vb.net, marcoratti, segue abaixo, ele le a pagina os links, se que com ele não da para colocar mais uma linha para ler o atributo ou linha especifica como essa que estou tentando ler e colocar no textbox?

    codigo abaixo,

    Public Class Web
    
        Public Function RequestDadosWeb(ByVal pstrURL As String) As String
            Dim oWebRequest As WebRequest
            Dim oWebResponse As WebResponse = Nothing
            Dim strBuffer As String = ""
            Dim objSR As StreamReader = Nothing
            'conecta com o website
            Try
                oWebRequest = HttpWebRequest.Create(pstrURL)
                oWebResponse = oWebRequest.GetResponse()
                'Le a resposta do web site e armazena em uma stream
                objSR = New StreamReader(oWebResponse.GetResponseStream)
                strBuffer = objSR.ReadToEnd
            Catch ex As Exception
                Throw ex
            Finally
                objSR.Close()
                oWebResponse.Close()
            End Try
            Return strBuffer
        End Function
        Public Function ExtrairLinks(ByVal url As String) As DataTable
            Dim dt As New DataTable
            dt.Columns.Add("LinkTexto")
            dt.Columns.Add("LinkUrl")
    
            Dim wc As New WebClient
            Dim html As String = wc.DownloadString(url)
    
            Dim links As MatchCollection = Regex.Matches(html, "<a.*?href=""(.*?)"".*?>(.*?)</a>")
    
            For Each match As Match In links
                Dim dr As DataRow = dt.NewRow
                Dim matchUrl As String = match.Groups(1).Value
    
                'Ignora todos os links âncoras
                If matchUrl.StartsWith("#") Then
                    Continue For
                End If
                'Ignora todas as chamadas javascript
                If matchUrl.ToLower.StartsWith("javascript:") Then
                    Continue For
                End If
                'Ignora todos os links de email
                If matchUrl.ToLower.StartsWith("mailto:") Then
                    Continue For
                End If
                'Para links internos, constroi a url mapeada para o endereço base
                If Not matchUrl.StartsWith("http://") And Not matchUrl.StartsWith("https://") Then
                    matchUrl = MapearUrl(url, matchUrl)
                End If
                'Inclui o link no datatable
                dr("LinkUrl") = matchUrl
                dr("LinkTexto") = match.Groups(2).Value
                dt.Rows.Add(dr)
            Next
    
            Return dt
        End Function
    
        Public Function MapearUrl(ByVal enderecoBase As String, ByVal caminhoRelativo As String) As String
            Dim u As New System.Uri(enderecoBase)
    
            If caminhoRelativo = "./" Then
                caminhoRelativo = "/"
            End If
    
            If caminhoRelativo.StartsWith("/") Then
                Return u.Scheme + Uri.SchemeDelimiter + u.Authority + caminhoRelativo
            Else
                Dim Caminho_Consulta As String = u.AbsolutePath
                ' Se o enderecoBase contem o nome do arquivo como ..../Something.aspx
                ' ajusta o nome do arquivo
                Caminho_Consulta = Caminho_Consulta.Split("?")(0).TrimEnd("/")
                If Caminho_Consulta.Split("/")(Caminho_Consulta.Split("/").Count - 1).Contains(".") Then
                    Caminho_Consulta = Caminho_Consulta.Substring(0, Caminho_Consulta.LastIndexOf("/"))
                End If
                enderecoBase = u.Scheme + Uri.SchemeDelimiter + u.Authority + Caminho_Consulta
    
                'se o caminhoRelativo contém ../ então
                ' ajusta o enderecoBase
                While caminhoRelativo.StartsWith("../")
                    caminhoRelativo = caminhoRelativo.Substring(3)
                    If enderecoBase.LastIndexOf("/") > enderecoBase.IndexOf("//" + 2) Then
                        enderecoBase = enderecoBase.Substring(0, enderecoBase.LastIndexOf("/")).TrimEnd("/")
                    End If
                End While
    
                Return enderecoBase + "/" + caminhoRelativo
            End If
    
        End Function
    
    End Class
    Private Sub btnObterPagina_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnObterPagina.Click
            Try
                Dim wc As New Web
                txtDados.Text = wc.RequestDadosWeb(txtUrl.Text.Trim)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Desde já agradeço, muito obrigado.

    Pablo Sousa.


    PabloSousa

    quinta-feira, 3 de agosto de 2017 16:03
  • Boa Noite Pessoal,

    Consegui resolver o problema acima, dessa forma abaixo, simples de tudo.

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            ' pega linha do html 
            Me.TextBox1.Text = WebBrowser1.Document.GetElementById("dia-topo").InnerText & " - " & WebBrowser1.Document.GetElementById("relogio").InnerText
    
    
        End Sub

    para quem estiver procurando esse codigo funciona bem.

    Pablo Sousa.


    PabloSousa

    • Marcado como Resposta Pablo_1977 terça-feira, 8 de agosto de 2017 03:08
    terça-feira, 8 de agosto de 2017 03:08