[PT-BR] Automatizando consultas de CEP com HtmlAgilityPack
Tags: html, csharp, dotnet
Published: 2020-08-22 07:50:25

Fala, galera! Beleza?

Nesse artigo vou lhes mostrar como automatizar consultas de CEPs no [site dos Correios](http://www2.correios.com.br/) através da biblioteca [HtmlAgilityPack](https://html-agility-pack.net/) para [.NET Core](https://docs.microsoft.com/pt-br/dotnet/core/).

Vamos lá!

Obs: para não deixar o artigo muito extenso, não vou explicar o passo a passo para se criar uma aplicação console no .NET Core.

1) Após a criação da aplicação console, instale a biblioteca do HtmlAgilityPack através do [NuGet](https://www.nuget.org/packages/HtmlAgilityPack/).
Você pode instalar usando o Gerenciador de pacotes do nuget dentro do Visual Studio:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/btxmkeu0kqkdrun2tzoy.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/u9ff7bfhs3xvhq53py3n.png)

Agora que já temos nosso pacote instalado, vamos adicionar o seguinte trecho de código:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/70e128y5iuetwj6scbrg.png)

Uma breve explicação do trecho acima:
 Primeiro, pedimos para que o usuário insira o CEP para que a nossa aplicação busque o endereço correspondente. Após isso, passamos o CEP digitado para o nosso método chamado “BuscaEnderecoPeloCEP(cep)”.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/tlix0006115yb11sop2f.png)

Nessa primeira parte do nosso método, criamos três variáveis do tipo “string”: “httpResponse, html e UrlCorreio”.
Observação: A variável “httpResponse” será responsável por armazenar o html que é retornado após enviarmos uma requisição do tipo POST para o endereço dos Correios (armazenado na variável “UrlCorreio”).
Após isso, iniciamos o nosso bloco "Try-catch". Dentro dele, criamos uma variável do tipo “Dictionary<string, string>” (Aqui, pode-se usar qualquer coleção que seja do tipo Chave-Valor).
Iremos enviar essa coleção como um [FormUrlEncodedContent](https://docs.microsoft.com/pt-br/dotnet/api/system.net.http.formurlencodedcontent?view=netcore-3.1) dentro do nosso “HttpRequestMessage”. Para fazer a requisição para a url dos correios, criamos um bloco “using” instanciando um objeto do tipo “HttpClient”. Esse objeto será responsável por fazer a requisição HTTP.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/pj3yf2g69xeagoadnjc8.png)

Aqui, instanciamos um objeto do tipo “HtmlDocument” (classe do HtmlAgilityPack). Para podermos extrair todas as informações contidas dentro html retornado, passamos o html para o método “LoadHtml()”.
A váriavel “name” é do tipo “HtmlNodeCollection” e receberá todas as informações contidas na tag html “td”.
As variáveis “bairro, cidade e rua”, receberão as informações contidas nas posições dessa coleção (“name[1], name[2], name[0]”, respectivamente).
Por fim, a variável “endereco” receberá a concatenação das informações contidas em “bairro, cidade e rua” e então retornaremos essa informação.
Caso ocorra alguma exceção, retornaremos a mensagem do erro. (é possível melhorar, e muito, esse tipo de tratamento. Porém, não é o assunto principal aqui).

Como forma de estudo e afim de abstrair essas funcionalidades, cm março de 2020, criei uma biblioteca em [.NET Standard 2.0](https://docs.microsoft.com/pt-br/dotnet/standard/net-standard) para realizar essas consultas. Inclusive, é possível buscar os CEPs a partir de um endereço. Caso queira conferir, vou deixar os links aqui:
- [DotNetCepSearch - NuGet](https://www.nuget.org/packages/DotNetCepSearch)
- [DotNetCepSearch - Github](https://github.com/joao2391/DotNetCEPSearch)