Este conteúdo aborda como usar a biblioteca padrão do Python para acessar recursos da web e processar HTML com HTMLParser, incluindo exemplos práticos.
Exploramos urllib.request para requisições HTTP e HTMLParser para interpretar HTML, além de exemplos de extração de links e contagem de elementos.
URL e requisições com urllib.request: - urllib.request.urlopen(url) abre uma URL e retorna uma resposta semelhante à de um navegador. - A resposta pode ser lida com read() e decodificada para obter o HTML da página.
Exemplo (simplificado):
from urllib import request
def GetSource(url):
response = request.urlopen(url)
html = response.read().decode('utf-8')
return html
html = GetSource("https://www.example.com")
Observação: alguns servidores exigem um User-Agent para aceitar a requisição. Nesse caso, crie um objeto Request com cabeçalhos e passe para urlopen.
Exemplo com cabeçalho:
from urllib importrequest
url = "https://www.example.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
req = request.Request(url, headers=headers)
with request.urlopen(req) as resp:
html = resp.read().decode('utf-8')
HTMLParser e o conceito de handlers: - HTMLParser é uma classe da API padrão que lê HTML token por token. - É possível estender a classe e sobrescrever métodos como handle_starttag, handle_data, handle_endtag para executar ações ao encontrar tags, dados ou atributos.
Exemplo de extensão:
from html.parser import HTMLParser
class MyParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == 'a':
for name, value in attrs:
if name == 'href':
print(value)
def handle_data(self, data):
pass
Com o MyParser, é possível extrair todos os links de um trecho HTML, percorrendo os atributos de cada tag .
Exemplo de prática de extração de polos (exemplo hipotético da página universidade): - Identificar parágrafos
com atributo class="item polos". - Contar quantos polos aparecem nessa página.
class PoloParser(HTMLParser):
def __init__(self):
super().__init__()
self.count = 0
def handle_starttag(self, tag, attrs):
if tag == 'p':
attrs_dict = dict(attrs)
if attrs_dict.get('class') == 'item polos':
self.count += 1
# Ao final
print(self.count)
Exercício de prática: leia o HTML da página de polos e conte quantos itens com class="item polos" existem dentro de
.
Dicas rápidas:
- Use request.Request para adicionar cabeçalhos.
- Use HTMLParser para extrair dados estruturados de HTML.
- Em notebooks, imprima outputs em etapas para facilitar a depuração.
Resposta correta: A) urllib.request
O urllib.request fornece a função urlopen para abrir URLs e obter respostas de recursos web.
Resposta correta: B) handle_starttag
Para ações ao encontrar a tag de abertura, sobrescreva handle_starttag(self, tag, attrs).
Resposta correta: B) User-Agent
O cabeçalho User-Agent ajuda o servidor a identificar o cliente e pode permitir ou negar o acesso.
Resposta correta: B) Filtrar por atributos relevantes (ex.: class="item polos") dentro de <p>
Usar atributos (como class) para filtrar os elementos alvo evita contagens falsas e melhora a precisão do parsing.
Observação: ao selecionar uma resposta, o botão correspondente é habilitado. Ao clicar em "Mostrar Resposta", a opção fica fixa para aquela questão e a pontuação é atualizada conforme o acerto.
O Lá pessoal, bem-vindos novamente, nossa disciplina de algoritmos e programação de compadores 2.
Nesta semana, a gente está vendo uma aplicação bastante interessante, que é a programação para o web.
Eu estou apresentando para vocês alguns conceitos relacionados com o web e internet.
Também na aula passada, a gente viu HTML e JSON.
E nesta última vídeo aula, desta semana, a gente vai ver um pouco sobre a biblioteca, que é disponibilizada pela linguagem em Python, para fazer processamento de elementos da web.
Então, a gente vai ver esta API, que permite que a gente faça manipulação de países na web, de elementos da web de modo geral.
Então, só relembrando um pouquinho das duas últimas vídeo-aulas, a gente viu na primeira fundamentos da web, incluindo o URL, a GATTP e um pouco de HTML.
E depois, na última vídeo aula, eu falei para vocês sobre intercâmbio de dados, por meio de padrões ações, onde a gente viu os padrões HTML e JSON.
E nesta vídeo aula, a gente vai ver alguns modulos da biblioteca padrão Python para acessar e processar recursos da web.
Então, o primeiro módulo que a gente vai ver é o módulo URL.
request, que permite fazer uma requisição por um determinado recurso a um servidor e receber os recursos que foram requisitados, de módulo a ser algo parecido como um navegador.
Então, o que a gente vai fazer? A gente vai substituir o navegador que a gente está acostumado a utilizar e vai fazer a requisição a um determinado servidor, a uma determinada URL, pelo nosso próprio programa, por código mesmo.
A gente vai usar esta função URL Open, que você passa como parâmetro para ela uma URL, como eu falei, consiste lá de um lentificador, de uma localização, de um recurso.
E esta função também formula uma requisição HTTP, parecida com aquele que eu calabamos mensagens, de calabensagem de requisição que eu falei para vocês, que eu mostrei nas vídeo aulas passadas.
Isso é criado automaticamente pela função URL e ela mesmo engia essa requisição ao servidor especificado na URL.
E esta função também obtém e retorna como resposta, uma resposta, uma resposta, a HTML, que veio lá do servidor.
Então, vamos ver como a gente faria isso, deixou apresentar aqui a minha tela.
Aqui, pessoal, eu estou usando o Júpiter da Unitrepretador Júpiter, porque essas bibliotecas, elas têm que ser bastante atualizadas, e têm que estar atualizadas para poder funcionar.
E esta, nesse tipo de aplicação da Web, se você tem uma instalação Python, na sua máquina, que ela é defasada ou ela não está tão atualizado, ela pode gerar alguns problemas na hora de você fazer essas requisições.
Então, eu já quis apresentar para vocês aqui uma solução, que é utilizar o próprio Júpiter, porque daí todas as bibliotecas já vão estar atualizadas e você não vai ter problemas para rodar esses códigos.
Então, se vocês quiserem, podem testar rodar no computador de vocês com um Python que vocês têm instalado, mas tem um ciência de que, se não tiver atualizado, essas bibliotecas pode ser que ocorrem alguns problemas.
Então, eu sugiro que ou vocês atualizem a biblioteca, o Python, ou fazer que eu estou fazendo aqui, que é rodar no próprio Júpiter.
Então, o que eu vou fazer aqui? Eu vou começar.
.
.
eu vou começar importando algumas bibliotecas, então eu vou importar o URL.
request, e dela eu vou importar o URL, então, é a função que a gente vai usar para abrir ou emitir a requisição para o servidor.
E eu vou definir aqui uma função chamada de GetSource, onde eu vou passar aqui a URL com um parâmetro, e esta função vai.
.
.
A gente vai ter uma variável chamada de Response, que vai receber o resultado da chamada da função URL Open, onde a gente vai passar a URL com um parâmetro.
E a partir desse response, a gente consegue obter o código HTML da resposta que o servidor nos enviou.
A gente faz isso acessando a variável response.
read.
Queremos que a gente tanque esta função read, a gente obtém o conteúdo daquela resposta que o servidor nos informou.
E aí, a gente pode dar um return em HTML.
decode, porque daí esta função decode era decotificar aquele conteúdo e vai enviar para fora dessa função uma string que contém os elementos HTML da recursos que a gente requisitou.
E aí a chamada, a gente vai fazer HTML, Recebe, GetSource, e aqui vocês podem passar alguma URL que vocês querem.
Eu vou fazer acessando a URL da URL da www.
ual.
com.
br.
Então, esse é o endereço do servidor onde a gente vai fazer a requisição.
E aqui eu vou mandar imprimir esse conteúdo.
Estou executando, em andando imprimir o HTML, reparem que este texto que foi que apareceu para a gente, é exatamente o conteúdo da página inicial da Wall.
Então, se vocês entrarem no navegador, colocando o endereço da www.
ual.
com.
br e acessar o código fonte desta página, vocês vão ver que o código vai ser exatamente igual a este que está aqui.
Está legal? Bom, e aí a gente tem agora uma outra biblioteca que é o HTML parser.
Esse módulo tem disponível ali dentro uma classe chamada de HTML parser, que consiste em processar elementos HTML de uma página web.
Então, dentro deste desta classe HTML parser, a gente tem um método chamado de filha, que é isso aqui, que recebe como uma entrada ou uma página HTML, que pode ser aquele texto que a gente acabou de ver com os textes, os elementos HTML da Wall.
Eu acho que é outro servidor.
E para cada token lido, que são as tags HTML que vão estar contidas ali naquela string, ele vai executar um handler correspondente.
Então, a gente tem dentro desta classe alguns métodos previamente definidos que vão ser executados a cada tag ou a cada elemento que for lido pelo parser, lá daquele texto, daquela string, lá que contém o código HTML.
Então, por exemplo, quando ele ler o HTML, ele vai executar este handler, que é uma função que está definida lá dentro daquela classe.
Quando ele encontrar uma outra tag, por exemplo, Red, ele também vai executar a mesma função passando comparando ali o nome da tag que foi lida.
E assim por diante, quando ele encontrar um texto, por exemplo, como um texto que está dentro de uma tag, ele vai executar uma outra função que é o handleData, que vai se responsável também por executar alguma outra tarefa.
Então, o que eu vou fazer? Eu vou abrir aqui uma nova célula.
E aqui a gente vai importar o HTML do parser, a gente vai importar o parser HTML.
Está certo? E aqui a gente vai fazer parser, recebe HTML parser para criar o objeto do tipo HTML parser.
E aí a gente vai chamar a função parser.
fíl passando comparando o HTML, que é aquela variável que contém este texto que está aqui em cima.
Está legal? Exocutando, pessoal, reparem que não ocorreu nada, não foi gerada nenhuma saída.
Isso já era esperado.
O que acontece é que cada uma daquelas funções de gerenciar alguma ação e alguma coisa do HTML foram implementadas de propósito para exatamente não fazer nada.
Para trazer alguma funcionalidade a um determinado handler que a gente queira é necessário sobre escrever cada uma desses métodos.
A gente faz isso estendendo a classe HTML parser.
Vamos ver como ficaria isso daí.
Então, aqui, pessoal, eu vou criar uma outra classe aqui, uma classe, que eu vou chamar de MyParser.
E essa classe vai estender de HTML parser.
Além de dentro, a gente vai definir uma função chamada de Rengler StartTeg.
E essa função recebe como parando o próprio objeto.
A tag em C e os attributes que estão associados a esta tag.
Reparem que esta função, pessoal, ela está definida em HTML parser.
Só que aqui, na esta classe, a gente está implementando ela na nossa classe MyParser, porque ela estende de HTML parser.
Quando a gente quer trazer alguma funcionalidade para um determinado elemento, a gente só sobrescrever aquele método correspondente para implementar a funcionalidade que a gente deseja.
Então, o que a gente vai fazer aqui? A gente vai verificar se a tag for igual a Ancura, o elemento A que corresponde a uma Ancura, o HTML.
A gente vai fazer um for de todos os attributes, que vão estar nesta lista de attributes.
E se o atributo, o nome do atributo que está na posição zero desse vetor, for igual ao HF, a gente vai mandar imprimir o conteúdo deste atributo, que é o ATTE de um.
Então, esta função, ela consiste em percorrer todo esse código HTML que está aqui, e ele vai imprimir todos os links que existem aqui.
Aqui, a gente vai criar o objeto agora do tipo MyParser, e aí a gente consegue executar a função feed, e aí ela vai chamar esse método aqui que a gente está implementando.
Então, olha só que a gente tem preço todos, todas as URLs que estão contidas nos atributos, HF, dos elementos A, deste código HTML que está aqui em SIN.
Está legal? Mais um outro exemplo para a gente finalizar, suponha que a gente quer retornar o número de polos de um determinado curso da Universidade.
Então, o que a gente vai ver é da engenharia de computação.
A gente vai usar esse enderício que eu vou colocar aqui para vocês.
Então, pessoal, esse endereço aqui ao universo.
br, bar cursos, bar engenharia, de computação, corresponde a esta página da universo, onde tem um curso da engenharia da computação.
E se a gente descer, a gente vai ter aqui todos os polos que estão cadastrados aqui nesta página.
E a gente vai implementar, então, um parcer desta página, e este parcer vai nos retornar a quantidade de polos que eu tenho aqui nesta página.
Para fazer isso, a gente vai dar uma olhada primeiro no código fonte desta página.
Reparem que, abrindo o código fonte, lá para baixo, a gente vai ter aqueles polos contidos dentro desses elementos P, que corresponde a um paráfono.
E eu tenho um atributo chamado de clés, e um valor desse atributo é o item polos.
Então, pessoal, a gente vai usar esta informação para poder fazer o nosso parcer.
Então, ele vai encontrar todos os elementos P, cujo atributo clés é igual a item polos, e a partir daí, a gente consegue contabilizar quantos polos a gente tem.
Então, eu vou colocar aqui embaixo mais uma sela.
E aqui, pessoal, eu já tenho implementado o meu parcer, eu não vou digitar ele novamente, porque, se não, a gente vai perder muito tempo.
Mas, olha só, eu tenho aqui a importação do HTML parcer, da URL Open.
Aqui, eu tenho a minha classe que está estendendo de HTML parcer.
Aqui, eu tenho um método de inicialização, que vai chamar a inicialização do HTML parcer.
E também, a gente vai inicializar o número de polos, igual a zero, para daí a gente poder começar a contabilizar.
Dentro dessa classe, também a gente tem a implementação da função Rendo ou StartTag.
E aqui é a mesma ideia.
A gente vai verificar se a tag é um P, que corresponde a este elemento P aqui.
Aí, a gente vai dado que a tag é um P, a gente vai percorrer pelos atributos.
Então, se um determinado atributo for o class, e o valor deste atributo for item polos, que corresponde exatamente a isto daqui, ao atributo class e o valor item polos, ele vai entrar neste if, e aqui ele vai incrementar o número de polos em uma unidade.
Fazendo isso para todo o código HTML daquela página, ele retorna o número de polos por meio da função num polos.
Uma outra coisa que é diferente do que a gente já fez, é que para a gente fazer a requisição para o servidor do HTML, a gente precisa para esta página específico, formular também alguns cabeçalhos para ficar algo parecido como uma requisição que o próprio navegador crie para o servidor.
Isso porque se a gente fizer aquele exemplo anterior de não colocar nenhum cabeçalho, alguns servidores, por segurança, eles não atendem a essas requisições que são anônimas que não fornecem informação sobre o navegador e nem nada.
Então a gente consegue, por meio deste código, entre aspas em canal o servidor, dizendo que a gente está utilizando o navegador usela, um crome, tem algumas informações aqui de um navegador qualquer, e com isso o servidor ele acaba aceitando aquela requisição.
Aqui eu faço, eu crio a requisição, passando o cabeçalho e passando ao RL que a gente está passando aqui com o parâmetro, que é exatamente a lá daquela página da engenharia da computação da Universitat.
A gente leia o HTML e retorna esse HTML decodificado.
Aqui é a chamada, ao parcer passando esse HTML e aqui ele vai informar o número de polos para a gente.
Então vamos executar isso.
Então está aqui a resposta a 3507 polos, são o número de polos que está cadastrado lá naquela página.
Está legal? Então pessoal, essa foi a nossa videoaula sobre a biblioteca para fazer manipulação de elementos da Web.
Logicamente que existem muitas outras funcionalidades desta API, a gente não vai entrar em muitos detalhes sobre elas, porque a ideia mesmo aqui é você estere uma noção do que a gente consegue fazer com a linguagem-partom para determinadas aplicações.
Espero que vocês possam ter compreendido sobre esses conceitos de Web, de internet e uso de destas bibliotecas específicas.
E a gente se vem então na próxima semana com mais um conteúdo.
Obrigado e até lá.