O web scraping com expressões regulares pode ser uma ferramenta poderosa para extrair dados de sites, no entanto, também tem as suas limitações. Um dos principais problemas com a utilização de regex para web scraping é que pode falhar quando a estrutura do HTML muda.
Por exemplo, considere o seguinte exemplo de código, onde estamos a tentar extrair o texto do h2 usando regex:
<html>
<head>
<title>Example Title</title>
</head>
<body>
<h1>Page Title</h1>
<p>This is a paragraph under the title</p>
<h2>First Subtitle</h2>
<p>First paragraph under the subtitle</p>
<h2>Second Subtitle</p>
</body>
</html>
Compare a primeira tag <h2> com a segunda. Poderá notar que a segunda tag <h2> não está devidamente fechada e que o código tem </p> em vez de </h2>. Vamos atualizar o trecho com isto:
import re
html = "<html><head><title>Example Title</title></head><body><h1>Page Title</h1><p>This is a paragraph under the title</p><h2>First Subtitle</h2><p>First paragraph under the subtitle</p><h2>Second Subtitle</p></body></html>"
headingTags = re.findall("<h2>(.*?)</h2>", html)
print(*headingTags, sep = "\n")
Vamos executar o código e verificar o resultado:
First Subtitle
Falta o texto da segunda tag de título. Isto acontece porque a regra de expressão regular não corresponde à tag de título não fechada.
Uma solução para este problema é utilizar uma biblioteca como a BeautifulSoup, que permite navegar e pesquisar na estrutura da árvore HTML, em vez de depender de expressões regulares. Com a BeautifulSoup, pode extrair o título de uma página web da seguinte forma:
from bs4 import BeautifulSoup
html = "<html><head><title>Example Title</title></head><body><h1>Page Title</h1><p>This is a paragraph under the title</p><h2>First Subtitle</h2><p>First paragraph under the subtitle</p><h2>Second Subtitle</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
for headingTag in soup.findAll('h2'):
print(headingTag.text)
O BeautifulSoup consegue extrair tags malformadas e o resultado fica assim:
First Subtitle
Second Subtitle
Esta abordagem é mais robusta face a alterações na estrutura HTML, uma vez que não depende de padrões específicos no código HTML. Se estiver interessado em saber mais sobre o BeautifulSoup, este artigo é a leitura perfeita.
Outra solução é utilizar uma API de web scraping, como a WebScrapingAPI, que simplifica as complexidades do web scraping e permite extrair facilmente os dados de que necessita sem se preocupar com a estrutura HTML subjacente.
Com a WebScrapingAPI, pode extrair dados de qualquer site com uma simples chamada de API, e esta lida automaticamente com alterações na estrutura HTML.