VB .NET - Extraindo HTML e Convertendo para texto - I


 

 No artigo de hoje vou mostrar como podemos realizar o tratamento do código HTML obtido a partir de uma web page realizando tarefas como obter o HTML, converter para texto, extrair links e extrair imagens.

 

Neste artigo irei mostrar como podemos efetuar o tratamento do código HTML obtido em páginas da internet usando os recursos da classe WebClient e expressões regulares via classe Regex.
 

 

Obtendo informações da Web
 

A plataforma .NET fornece duas classes presentes no namespace System.NET que podemos usar para podermos interagir diretamente com servidores usando HTTP. São elas:

  1. WebRequest - Realiza uma requisição para uma URI - Uniform Resource Identifier.

  2. WebResponse - Fornece uma resposta a partir de uma URI - Uniform Resource Identifier

Para podermos usar os recursos da classe WebRequest podemos usar as classes HttpWebRequest e HttpWebResponse que fornecem implementações específicas destas classes.
 

Dessa forma a classe HttpWebRequest fornece suporte para as propriedades e métodos definidos na classe WebRequest e para propriedades e métodos adicionais que permitem interagir usando o protocolo HTTP.
 

- O método Create() de uma instância da classe WebRequest para iniciar os objetos HttpWebRequest;
- O método GetResponse() realiza uma requisição síncrona através da propriedade RequestUri, retornando um objeto HttpWebResponse contendo a resposta de uma requisição;
- O método GetRequestStream() obtém um objeto stream usado para escrever os dados da requisição;


Usando estas duas classes, temos tudo que precisamos para fazer o download de uma página Web completa em um stream ou postar dados para uma URL.


Expressões Regulares

A  plataforma .NET vem com um poderoso mecanismo de expressões regulares que é acessível a qualquer linguagem da plataforma: VB.NET, C#, etc.

Uma expressão regular ou regex para simplificar, é um modelo que descreve uma certa quantidade de texto. A expressão regular mais simples consiste de um único caractere. Ex: a. Este padrão irá coincidir com a primeira ocorrência do caractere em uma string. Se a string for "Isto é apenas um teste"  a primeira ocorrência será a letra a antes da letra p (de apenas).

As expressões regulares possuem 11 caracteres especiais conhecidos como meta caracteres, são eles:

Para usar qualquer um destes caracteres como um literal em uma expressão regular temos que usar um caractere de escape (\). Assim se você deseja escrever 1+1=2 deverá usar 1 \+ 1=2  de outra forma o caractere + terá um significado especial.

Regex é a classe mais importante deste grupo e qualquer código para um expressão regular instancia pelo menos um objeto desta classe ( ou usar um dos métodos estáticos da classe Regex). Você instancia este objeto passando o padrão de critério escrito no formato especial da linguagem usada para expressão regulares. No exemplo a seguir a expressão regular define qualquer grupo de dois caracteres consistindo de uma vogal seguida por um dígito:

Dim re As New Regex("[aeiou\d")

O método de localização do objeto Regex aplica a expressão regular a string passada como argumento; e retorna um objeto do tipo MatchCollection, uma coleção somente-leitura que representa todas as ocorrências coincidentes com o critério usado.

A classe Regex representa o mecanismo para tratar as expressões regulares na plataforma .NET . Ela pode ser usado para analisar rapidamente grandes quantidades de texto para encontrar padrões de caracteres específicos; para extrair, editar, substituir ou excluir substrings de texto, ou para adicionar as strings extraídas a uma coleção para gerar um relatório.

Para usar as expressões regulares, definimos o padrão desejado para identificar em um fluxo de texto usando a sintaxe documentada nos elementos de linguagem das expressões regulares. A seguir instanciamos um objeto Regex. Finalmente, executamos alguma operação, como a substituição de texto que corresponda ao padrão de expressão regular, ou a identificação de um padrão coincidente.

A enumeração RegexOptions fornece valores enumerados para usar para definir opções de expressões regulares. Os valores possíveis são:

Valor Descrição
None Especifica que nenhuma opção foi definida
IgnoreCase Especifica a comparação case-sensitive
ExplicitCapture Especifica que as únicas capturas válidas são explicitamente nomeadas ou grupos numerados do formulário (? <name> ...).
Isso permite que os parênteses sem nome atuem como grupos de não captura, sem a deselegância sintática da expressão (:? ...).
Singleline Especifica modo linha-única. Muda o significado do ponto (.) Para que coincida com todos os caracteres (em vez de cada caractere, exceto \ n).
IgnorePatternWhitespace Elimina espaços em branco sem escape do padrão e permite comentários marcados com #. No entanto, o valor IgnorePatternWhitespace não  afeta ou elimina o espaço em branco nas classes de caracteres.
ECMAScript Permite o comportamento compatível com ECMAScript para a expressão. Este valor pode ser usado apenas em conjunto com os valores IgnoreCase, Multiline, e Compiled. A utilização deste valor com quaisquer outros valores gera uma excepção.
CultureInvariant Especifica que as diferenças culturais na linguagem será ignorada.
Compiled Especifica que a expressão regular é compilada para um assembly. Isto obtém um rendimento melhor na execução, mas aumenta o tempo de inicialização. Este valor não deve ser atribuído à propriedade Opções ao chamar o método CompileToAssembly.
Multiline Modo multilinha. Altera o significado de ^ e $ para que eles correspondam ao início e final, respectivamente, de qualquer linha, e não apenas  o início e o fim de toda a cadeia.
RightToLeft Especifica que a pesquisa será da direita para a esquerda em vez de da esquerda para a direita.

 

Recursos usados :

Criando o projeto no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual Basic -> Windows Forms Application;

Informe o nome Tratando_HTML e clique no botão OK;

 

A seguir a partir da ToolBox inclua os seguintes controles no formulário do projeto:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

 

 

1- Obtendo código HTML e convertendo para texto

 

 

O objetivo e obter código HTML de uma URL informada e em  seguida converter o código HTML para texto.


Os namespaces usados são:

Imports System.Text
Imports
System.Text.RegularExpressions

 

O HTML é obtido da URL usando o método DownloadData

UTF8Encoding().GetString(objWC.DownloadData(URL))
 

A conversão do HTML para texto é feito via expressões regulares:

objRegEx.Replace(HTML, "<[^>]*>", "")

 

O código do projeto é exibido abaixo:
 

  Private Sub btnHTML_Click(sender As Object, e As EventArgs) Handles btnHTML.Click
        Try
            txtHTML.Text = pegaHTML(txtURL.Text)
        Catch ex As Exception
            MessageBox.Show(" Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
  
    Private Sub btnHTML_Texto_Click(sender As Object, e As EventArgs) Handles btnHTML_Texto.Click
        Try
            txtTexto.Text = removeTags(txtURL.Text)
        Catch ex As Exception
            MessageBox.Show(" Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
 Public Function removeTags(ByVal HTML As String) As String
        Try
            'Remove as tags do HTML
            Return Regex.Replace(HTML, "<[^>]*>", "")
        Catch ex As Exception
            MessageBox.Show(" Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Function

    Public Function pegaHTML(ByVal URL As String) As String
        ' Retorna o HTML da URL informada
        Dim objWC As New System.Net.WebClient
        Return New UTF8Encoding().GetString(objWC.DownloadData(URL))
    End Function

 

Estamos usando dois métodos :

Executando o projeto obtemos:

 

Fica como tarefa para você realizar um ajuste mais fino na conversão do código HTML para texto usando as expressões regulares.

 

Na segunda parte do artigo eu vou mostrar com podemos extrair links e imagens do código HTML usando expressões regulares.

 

Pegue a primeira parte do projeto aqui :  WebBrowser_1.zip

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti