CodeGym /Cursos /Python SELF PT /Extração de dados de estruturas HTML complexas

Extração de dados de estruturas HTML complexas

Python SELF PT
Nível 34 , Lição 0
Disponível

1. Fundamentos do trabalho com estruturas HTML complexas

Antes de começarmos a explorar marcações HTML complexas, é importante entender por que o HTML pode ser tão confuso. Desenvolvedores da web frequentemente utilizam elementos aninhados complexos para organizar conteúdo, o que pode se tornar um verdadeiro caos para quem tenta extrair dados dessas páginas. Mas não se preocupe — com um bom plano e as ferramentas certas, você vai tirar isso de letra!

Analisando a árvore HTML

Imagine um documento HTML como uma árvore: cada elemento é um nó que pode conter texto ou outros nós. No topo dessa árvore está o html, seguido por head e body, e então vários elementos filhos. Os elementos aninhados estão mais fundo nessa árvore.

Exemplo de uma estrutura HTML simples:

HTML

<html>
  <head>
    <title>Exemplo</title>
  </head>
  <body>
    <div class="content">
      <h1>Título</h1>
      <p>Parágrafo 1</p>
      <p>Parágrafo 2</p>
      <div class="nested">
        <ul>
          <li>Elemento 1</li>
          <li>Elemento 2</li>
          <li><span>Elemento 3</span></li>
        </ul>
      </div>
    </div>
  </body>
</html>

Como você pode ver, temos um div com a classe nested, que contém um ul, e este, por sua vez, está cheio de li. Este é um exemplo de como os elementos podem estar aninhados.

2. BeautifulSoup para extração de dados

Extraindo dados de elementos aninhados

Vamos relembrar como o BeautifulSoup funciona. Vamos usar o BeautifulSoup para extrair o texto de uma lista li. É hora de se tornar um verdadeiro detetive e coletar dados das nossas estruturas aninhadas.

Python

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
nested_items = soup.select('.nested ul li')

for item in nested_items:
    print(item.get_text())

Resultado:


Elemento 1
Elemento 2
Elemento 3

Como você pode ver, usamos o método select com o seletor CSS para encontrar todos os li dentro do elemento com a classe nested. O método get_text() permite extrair o texto diretamente dos elementos encontrados.

3. Trabalhando com elementos em níveis múltiplos

Às vezes, os dados não estão apenas em profundidades diferentes na estrutura, mas também distribuídos em vários níveis, o que torna a extração mais complicada. Vamos descobrir como extrair informações de uma árvore HTML mais complexa.

Exemplo de estrutura complexa:

HTML

<html>
  <body>
    <div class="wrapper">
      <div class="header">
        <h1>Este é um título</h1>
      </div>
      <div class="content">
        <div class="article">
          <h2>Artigo 1</h2>
          <p>Conteúdo do artigo 1</p>
        </div>
        <div class="article">
          <h2>Artigo 2</h2>
          <p>Conteúdo do artigo 2</p>
        </div>
      </div>
      <div class="footer">
        <p>Informações de contato</p>
      </div>
    </div>
  </body>
</html>

Extraindo dados dos níveis

Agora vamos tentar extrair os títulos de todos os artigos e seus conteúdos.

Python

articles = soup.select('.content .article')

for article in articles:
    title = article.find('h2').get_text()
    content = article.find('p').get_text()
    print(f'Título: {title}')
    print(f'Conteúdo: {content}\n')

Saída esperada:


Título: Artigo 1
Conteúdo: Conteúdo do artigo 1

Título: Artigo 2
Conteúdo: Conteúdo do artigo 2

Usamos a combinação dos métodos select e find para alcançar nossos objetivos. select ajuda a encontrar o elemento pai, enquanto o find extrai informações dos filhos.

4. Particularidades de trabalhar com elementos aninhados

Ao analisar páginas da web, você pode se deparar com desafios como a existência de vários elementos aninhados com as mesmas classes ou tags. Nesses casos, o uso de pesquisa contextual e a identificação clara dos elementos necessários ajudam a evitar erros.

Exemplo de aninhamento complexo:

HTML

<html>
  <body>
    <div class="container">
      <div class="item">
        <h2>Número 1</h2>
        <div class="details">Detalhes 1</div>
      </div>
      <div class="item">
        <h2>Número 2</h2>
        <div class="details">Detalhes 2</div>
        <div class="additional">
          <div class="info">Info adicional</div>
        </div>
      </div>
    </div>
  </body>
</html>

Extraindo dados considerando o aninhamento

Para evitar confusão, você deve localizar os elementos mais específicos:

Python

items = soup.select('.container .item')

for item in items:
    number = item.find('h2').get_text()
    details = item.select_one('.details').get_text()
    additional_info = item.select_one('.additional .info')
    
    print(f'Número: {number}')
    print(f'Detalhes: {details}')
    
    if additional_info:
        print(f'Info Adicional: {additional_info.get_text()}')
    print()

Aqui usamos o método select_one, que retorna apenas o primeiro elemento encontrado, para evitar duplicação de dados dos blocos adicionais.

5. Aspectos práticos e erros comuns

Ao trabalhar com estruturas HTML complexas, é fácil se perder ou encontrar erros. Um dos erros mais comuns é tentar acessar um elemento inexistente, o que leva a um AttributeError. Para evitar isso, sempre verifique a existência do elemento antes de trabalhar com ele.

Outra coisa importante é entender que nem sempre é necessário extrair os dados de uma vez só. Às vezes, é útil fazer uma análise preliminar da estrutura, usar saídas de depuração e verificar resultados intermediários.

Em projetos reais, habilidades de trabalhar com estruturas HTML aninhadas podem ser extremamente importantes. Isso se aplica não apenas ao web scraping, mas também ao teste de interfaces web, automação de testes e até mesmo à análise de dados de APIs complexas, onde as respostas podem ter um formato aninhado.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION