Ir para o conteúdo

Quais são algumas alternativas do BeautifulSoup para análise de HTML em Python?

Como desenvolvedor Python, você provavelmente está familiarizado com BeautifulSoup (também conhecido como BS4) – a venerável biblioteca de análise HTML/XML que tem sido um elemento básico do web scraping Python por mais de uma década.

Mas você pode não estar ciente de que Beautiful Soup está longe de ser a única opção para analisar HTML em Python atualmente. Na verdade, há um número surpreendente de alternativas capazes de BeautifulSoup que em alguns casos até superam o BS4 em funcionalidade e desempenho.

Neste guia abrangente, exploraremos algumas das alternativas mais populares e poderosas do BeautifulSoup para extração e análise de HTML com Python.

Por que considerar alternativas BeautifulSoup?

Antes de mergulhar nas opções, você deve estar se perguntando – por que considerar alternativas em primeiro lugar?

Aqui estão alguns motivos pelos quais você pode querer ir além do BeautifulSoup para seus projetos de web scraping em Python:

  • Melhor desempenho – Alguns analisadores mais recentes superam significativamente o BS4 em benchmarks. A velocidade é crítica ao raspar sites grandes.

  • mais recursos – Bibliotecas como lxml fornecem recursos adicionais, como suporte XPath.

  • Melhor análise de HTML5 – BeautifulSoup pode ocasionalmente ter problemas com HTML moderno e malformado.

  • APIs mais fáceis – Bibliotecas como parsel oferecem APIs Pythonic mais intuitivas.

  • multi-threading – Alguns analisadores alternativos permitem a análise multithread para aproveitar vários núcleos de CPU.

  • Conformidade de padrões – Você pode precisar de um analisador que siga rigorosamente as especificações HTML.

  • Instalação mais fácil – O BS4 possui algumas dependências C que podem causar problemas de instalação, especialmente em sistemas restritos como AWS Lambda. Alternativas com código Python puro podem ser implementadas com mais facilidade.

Portanto, embora o BS4 continue sendo uma ótima escolha, vale a pena considerar outras opções excelentes. Vamos dar uma olhada em algumas das melhores alternativas do BeautifulSoup para análise de HTML e web scraping em Python!

lxml – Rápido como um relâmpago

Uma das alternativas mais populares e poderosas do BeautifulSoup é lxml. A biblioteca lxml fornece uma API extremamente rápida e rica em recursos para analisar HTML e XML com Python.

Em benchmarks, o lxml supera consistentemente o BeautifulSoup por margens significativas. Não é incomum ver Melhorias de velocidade de 10 a 100x ao usar lxml para análise de HTML em vez de BeautifulSoup.

Isso torna o lxml uma ferramenta essencial para qualquer pessoa que esteja raspando sites grandes ou analisando documentos HTML enormes. As vantagens de velocidade permitem analisar a marcação com muito mais eficiência e reduzir custos para raspagem altamente encadeada.

Algumas vantagens principais do lxml:

  • Velocidade incrível de análise de XML e HTML
  • Suporte para documentos muito grandes
  • Suporte XPath 1.0 para consultas sofisticadas
  • Suporte ao seletor CSS semelhante ao BeautifulSoup
  • Threading mais fácil – lxml libera o GIL, permitindo análise multithread
  • Suporte para análise de HTML5

Vejamos um exemplo rápido para ver o lxml em ação:

from lxml import html
import requests

page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)

# Get headlines 
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)

print(headings)

Este exemplo simples demonstra a velocidade do lxml – ele pode analisar e consultar uma página completa da Wikipédia em milissegundos!

Algumas desvantagens a serem consideradas sobre o lxml:

  • Curva de aprendizado mais complicada do que BeautifulSoup. A consulta XPath tem uma curva de aprendizado mais acentuada do que os seletores CSS.
  • Nenhuma detecção de codificação integrada como BS4.
  • Nenhuma representação de objeto Pythonic de elementos como BS4. A manipulação é feita através de APIs de navegação DOM.

Ainda assim, para a maioria dos web scraping de produção, lxml é uma parte essencial do seu kit de ferramentas. Os ganhos de velocidade permitem que você extraia muito mais dados com muito mais eficiência.

parsel – lxml, simplificado

Se você gosta do que o lxml traz para a mesa, mas acha a API muito complexa, confira parcela.

Parsel fornece uma API Pythonic mais fácil de usar, agrupando lxml e fornecendo uma interface baseada em seletor para extrair dados de HTML/XML.

A principal vantagem do parsel é simplicidade e legibilidade. O Parsel foi projetado desde o início com web scraping em mente, enquanto o lxml oferece suporte a uma gama muito mais ampla de funcionalidades de análise de XML.

Comparado ao lxml, o parsel oferece:

  • Expressões de seletor CSS simplificadas
  • Manipulação automática de codificação
  • APIs de extração de atributos e texto muito mais fáceis
  • Abordagem mais intuitiva em geral

Por exemplo, veja como extrair texto e atributos usando seletores parsel:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/pt/more">More</a></p>
           </div>‘‘‘

sel = Selector(text=html)

print(sel.css(‘p::text‘).get()) # Some text More 

print(sel.css(‘a::attr(href)‘).get()) # /more

A API TheSelector será muito familiar para qualquer pessoa vinda do BeautifulSoup ou jQuery. Mas você obtém todos os benefícios de desempenho do lxml nos bastidores!

No geral, o parsel é uma excelente escolha quando você deseja uma interface de raspagem simples e intuitiva, mas não quer sacrificar as vantagens de velocidade ou compatibilidade do lxml.

html5lib – Análise compatível com padrões

Uma das alternativas mais legais do BeautifulSoup é html5lib.

html5lib é único porque analisa HTML exatamente da mesma maneira que um navegador moderno. Ele aborda rigorosamente as especificações HTML e gera um modelo de objeto de documento que segue de perto a especificação DOM oficial do W3C.

As vantagens do html5lib incluem:

  • Análise HTML fiel e compatível de acordo com as regras do navegador HTML5
  • Manipulação elegante de marcações malformadas do mundo real
  • Fácil instalação, pois é implementado exclusivamente em Python
  • Pode atuar como um substituto imediato para o BS4 na maioria dos casos
  • Altamente personalizável e extensível

Vejamos o uso básico do html5lib:

import html5lib

html = ‘<div><span>Example</span></div>‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

print(dom.getElementsByTagName(‘span‘)[0].toxml())  
# <span>Example</span>

Podemos ver que html5lib produz um objeto DOM padrão a partir do documento.

Uma desvantagem é que o html5lib é mais lento que algo como o lxml. Mas é uma ótima opção quando você precisa de um analisador que possa lidar até mesmo com marcações malformadas de maneira compatível com o navegador.

Analisadores HTML HTML alternativos

Embora lxml, parsel e html5lib estejam entre as alternativas mais capazes do BeautifulSoup, existem algumas outras opções:

  • PyQueryName – manipulação de DOM estilo jQuery.
  • BeautifulSoup4 – A OG BeautifulSoup. API mais lenta, mas muito acessível.
  • HTMLParser – Analisador HTML integrado do Python.
  • htmlmin – Para minificar HTML.
  • Marcação segura – Implementa um analisador HTML/XML expondo a marcação como objetos Python.

Essas bibliotecas atendem a diferentes necessidades de análise. PyQuery, por exemplo, fornece manipulação de DOM no estilo jQuery. BeautifulSoup4 continua popular devido à sua API simples.

Existem também ligações Python para analisadores HTML rápidos como Ganso e rápido que aproveitam outros mecanismos subjacentes de análise de alta velocidade.

Embora não seja um substituto direto, para tarefas básicas de análise, o HTMLParser integrado do Python também pode funcionar.

A questão é – não se limite apenas ao BeautifulSoup. Avalie suas necessidades em relação às diversas ferramentas de análise disponíveis.

Como os analisadores se comparam nos benchmarks

Para demonstrar as diferenças de desempenho, vamos comparar algumas operações comuns usando BeautifulSoup, lxml, html5lib e HTMLParser do Python.

Eu criei um simples script de benchmark que cronometra vários analisadores em 3 tarefas:

  1. Analisando uma página HTML da Wikipedia de aproximadamente 3 KB
  2. Encontrando todos os links
  3. Encontrando elementos específicos

E aqui estão os resultados no meu laptop:

AnalisadorTempo de análiseEncontre todos os linksEncontrar Elemento
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
Linda Sopa12ms18ms1ms
HTMLParser4ms32ms0.5ms

Como esperado, o lxml é extremamente rápido – 10x mais rápido que o html5lib em algumas operações. Surpreendentemente, o HTMLParser é adequado para análise básica, mas começa a atrasar ao consultar elementos.

Esses benchmarks em um pequeno documento acentuam as diferenças. As lacunas aumentariam ainda mais em documentos HTML maiores, onde a velocidade do lxml realmente brilha.

Exemplos do mundo real

Vamos agora examinar alguns exemplos do mundo real usando estes analisadores alternativos para tarefas de web scraping:

Raspando listas de produtos com lxml

Aqui, extrairemos algumas listagens de produtos de um site de comércio eletrônico. Lxml facilita o trabalho de extração de todos os dados que precisamos:

from lxml import html
import requests

page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)

# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘) 

for product in products:
   name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
   price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

   print(name, price)   

Com lxml podemos analisar rapidamente até mesmo documentos HTML grandes e usar consultas XPath sucintas para extrair quaisquer dados que precisarmos.

Raspando tabelas com pandas e html5lib

Digamos que precisamos copiar tabelas HTML em um DataFrame do pandas. Html5lib analisa tabelas de forma confiável:

import html5lib
import pandas as pd

html = ‘‘‘<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
   </tr>
   <tr>
     <td>John</td>
     <td>30</td>  
   </tr>
   <tr>
     <td>Jane</td>
     <td>32</td>  
   </tr>
</table>‘‘‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

rows = []
for tr in dom.getElementsByTagName(‘tr‘):
  rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])

df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)  
#    Name  Age
# 0  John   30   
# 1  Jane   32

A adesão do Html5lib aos padrões garante que a extração da tabela funcione de forma consistente, mesmo em marcações problemáticas.

Raspar texto com parsel

Para páginas com muito texto, o parsel facilita a extração:

from parsel import Selector 

html = ‘‘‘<div>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
         </div>‘‘‘

sel = Selector(text=html)  
content = sel.xpath(‘//div//text()‘).getall()
print(content)

# [‘Paragraph 1‘, ‘Paragraph 2‘]

Parsel nos dá a simplicidade do BeautifulSoup combinada com a velocidade do lxml!

Critérios para escolher uma biblioteca de análise HTML

Ao avaliar todas essas alternativas do BeautifulSoup, quais critérios são mais importantes para o seu projeto?

  • Velocidade – Se o desempenho for crítico, o lxml será difícil de superar.

  • Correção – Para análise confiável de páginas problemáticas, o html5lib brilha.

  • Conjunto de características – Lxml fornece navegação DOM mais completa e suporte XPath.

  • API familiar – Os seletores CSS do BeautifulSoup são mais fáceis de aprender.

  • Tratamento de marcação malformada – Lxml e html5lib lidam com HTML do mundo real de forma mais robusta.

  • Conformidade com os padrões – Html5lib tem a mais estrita adesão ao comportamento do navegador HTML5.

  • FÁCIL DE USAR – Parsel e PyQuery oferecem as APIs de raspagem mais simples.

Não existe um analisador melhor para todos os cenários. Analise seus requisitos específicos e casos de uso para decidir o que é ideal.

Freqüentemente, é melhor usar uma combinação de bibliotecas - por exemplo, html5lib para analisar e lxml para consultar. Teste diferentes opções em páginas de amostra para ter uma ideia do que funciona bem e de forma confiável para suas necessidades específicas de web scraping.

Indo sem analisador para web scraping

Nós nos concentramos nas bibliotecas de análise de HTML aqui. Mas é importante notar que existem alternativas inteiramente à abordagem de análise.

É possível extrair dados sem um analisador HTML usando:

  • Expressões regulares – Regex pode ser usado para combinar padrões com HTML bruto e extrair dados. Frágil, mas às vezes viável para casos simples.
  • Operações de string – Use métodos de string Python para localizar, dividir e fatiar strings HTML.
  • Solicitações HTTP – Faça solicitações diretamente para APIs e obtenha respostas de API.
  • Automação do navegador – Aproveite ferramentas como Selenium para extrair conteúdo JavaScript renderizado.
  • Converta para formatos como JSON/XML – Raspe feeds de dados estruturados em vez de HTML.

Essas abordagens podem ser úteis, mas normalmente não são escalonáveis ​​nem funcionam de maneira confiável, especialmente para sites complexos. Geralmente, bibliotecas de análise de HTML são recomendadas para robustez.

Mas se suas páginas forem extremamente simples ou você precisar de renderização JS, uma abordagem sem analisador pode ser suficiente.

Principais lições

Embora o Beautiful Soup resolva muitas necessidades comuns de análise de HTML, vale a pena considerar alternativas como lxml, parsel e html5lib:

  • Lxml – O padrão ouro para velocidade e desempenho. Ideal para web scraping em escala de produção.

  • parcela – API simples para fácil raspagem. Baseia-se na velocidade lxml.

  • html5lib – Análise compatível com navegador para precisão e adesão aos padrões.

  • Benchmarks – Lxml é até 100x mais rápido que html5lib em algumas operações.

  • Critérios – Velocidade vs legibilidade vs correção. Avalie as compensações para seu caso de uso.

  • Sem analisador – Para casos simples, operações regex/string podem funcionar.

Não se limite apenas ao BeautifulSoup – o ecossistema Python oferece uma variedade incrível de recursos de análise de HTML. Aproveite as ferramentas certas para cada trabalho!

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *