Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida html

Olá. Fiz alguns testes e percebi que tem alguns sites que geram erro ao serem lidos com o comando pd.read_html().

Eu testei os dois sites abaixo, porém deu erro:

    **-Site passado como "exemplo equivalente" pela Alura:**

df_html = pd.read_html('https://www.federalreserve.gov/releases/h3/current/default.htm') df_html[0]

*Erro gerado: *

HTTPError Traceback (most recent call last) in <cell line: 1>() ----> 1 df_html = pd.read_html('https://www.federalreserve.gov/releases/h3/current/default.htm') 2 df_html[0]

12 frames /usr/lib/python3.9/urllib/request.py in http_error_default(self, req, fp, code, msg, hdrs) 639 class HTTPDefaultErrorHandler(BaseHandler): 640 def http_error_default(self, req, fp, code, msg, hdrs): --> 641 raise HTTPError(req.full_url, code, msg, hdrs, fp) 642 643 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 403: Forbidden

**-Site Wikipedia:**

df_html = pd.read_html('https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_população') df_html[0]

**Erro gerado: **

UnicodeEncodeError                        Traceback (most recent call last)

in <cell line: 1>() ----> 1 df_html = pd.read_html('https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_população') 2 df_html[0]

20 frames /usr/lib/python3.9/http/client.py in encoderequest(self, request) 1212 def encoderequest(self, request): 1213 # ASCII also helps prevent CVE-2019-9740. -> 1214 return request.encode('ascii') 1215 1216 def validatemethod(self, method):

UnicodeEncodeError: 'ascii' codec can't encode characters in position 60-61: ordinal not in range(128)

3 respostas

Olá Vivian, tudo belezinha?

O erro que você encontrou pode ter diversas causas, mas em geral, ele acontece quando o site que você está tentando ler não permite que o seu código acesse o seu conteúdo.

No caso do primeiro erro, o https://www.federalreserve.gov/releases/h3/current/default.htm, o erro 403 indica que o servidor está negando o acesso ao seu código. Isso pode acontecer porque o site pode estar protegido e ao tentar usar um read_html o acesso não sera autorizado.

Neste caso precisamos seguir o exemplo que foi passado na atividade anterior ao vídeo, podemos usar o Requests que é uma biblioteca Python usada para enviar solicitações HTTP. Essa Biblioteca permite que você envie solicitações com métodos HTTP como GET, POST, PUT, DELETE, etc. Então para exemplificar como você poderia usar no seu caso, podemos requisitar desta forma:

import requests
url = 'https://www.federalreserve.gov/releases/h3/current/default.htm'

r = requests.get(url)

tabela = pd.read_html(r.text) #usamos o ".text" para extrair apensas o conteúdo em formato de texto, ou seja o conteudo do html desta pagina em formato de string, assim agora o pandas consegue ler o html desta pagina.

tabela[0] #OBS: Acessando o link encontramos duas tabelas, caso queira a segunda tabela, basta mudar o tabela[0] para tabela[1]

Já no segundo erro, que aconteceu ao tentar ler a tabela da Wikipedia, o erro de UnicodeEncodeError indica que o Python não conseguiu ler corretamente a página. Isso acontece por que espeficicamente nesse link que foi passado existe caracteres especiais, por isso o read_html não consegue ler o link, por conta do "ç" e "ã" por exemplo. Para resolver isso podemos usar o quote para codificar esta URL e não ter problemas com caracteres especiais. Desta forma:

from urllib.parse import quote
url="https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_população"
url_tratada = quote(url, safe=':/') # este parametro safe esta dizendo que tanto o caracter : e o / não precisa ser codificado, e que o restante dos caracteres especiais serão convertidos.
df_html = pd.read_html(url_tratada)
df_html[0]

Uma outra forma de passar esse link no read_html é desta maneira: https://pt.wikipedia.org/wiki/Lista_de_unidades_federativas_do_Brasil_por_popula%C3%A7%C3%A3o, que seiria a tradução exata que usamos na variável url_tratada na solução de cima.

OBS: Se não fosse esses caracteres especiais, não precisaríamos de fazer este tratamento,

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e um forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá, Paulo!

Nesse segundo caso, seria devido à presença de caracteres especiais somente no nome da url ou nos valores das tabelas do site também?

Poderia me explicar melhor qual a lógica dos caracteres usados para substituir os itens especiais? Por exemplo:: Ç --> %C3 ; Ã --> %A7. Existe uma codificação pré-estabelecida para cada caracter especial?

Desde já agradeço pela ajuda! Já ajudou muito! Obrigada.

solução!

Olá Vivian, belezinha?

No caso, o problema são os caracteres especiais dentro do read_html. O conteúdo não influenciou no erro. No caso a lógica seria ç -> %C3%A7 e o ã -> %C3%A3. Existe uma tabela que mapeia esses caracteres, caso você tenha curiosidade você pode consultar a documentacao de UTF8.

Lembrando que não é necessário gravar esse conteúdo dessa tabela, na maioria das vezes ao copiar esses links direto do site, esses caracteres são convertidos automaticamente.