Raspagem de páginas da Web em Python com Beautiful Soup: pesquisa e modificação do DOM

No último tutorial, você aprendeu o básico da biblioteca Beautiful Soup. Além de navegar na árvore DOM, você também pode pesquisar por elementos com um determinado class ou id. Você também pode modificar a árvore DOM usando esta biblioteca.

Neste tutorial, você aprenderá sobre diferentes métodos que o ajudarão na busca e modificações. Estaremos raspando a mesma página da Wikipedia sobre Python do nosso último tutorial.

Filtros para pesquisar na árvore

Beautiful Soup tem muitos métodos para pesquisar a árvore DOM. Esses métodos são muito semelhantes e usam os mesmos tipos de filtros como argumentos. Portanto, faz sentido entender adequadamente os diferentes filtros antes de ler sobre os métodos. vou usar o mesmo find_all() método para explicar a diferença entre os diferentes filtros.

O filtro mais simples que você pode passar para qualquer método de pesquisa é uma string. O Beautiful Soup irá então pesquisar no documento para encontrar uma tag que corresponda exatamente à string.

Você também pode passar um objeto de expressão regular para o find_all() método. Desta vez, o Beautiful Soup filtrará a árvore combinando todas as tags com uma determinada expressão regular.

O código procurará todas as tags que começam com “h” e são seguidas por um dígito de 1 a 6. Em outras palavras, ele procurará todas as tags de cabeçalho no documento.

Em vez de usar regex, você pode obter o mesmo resultado passando uma lista de todas as tags que deseja que o Beautiful Soup corresponda ao documento.

Você também pode passar True como parâmetro para o find_all() método. O código retornará todas as tags no documento. A saída abaixo significa que existem atualmente 4.339 tags na página da Wikipedia que estamos analisando.

Se você ainda não conseguir encontrar o que está procurando com nenhum dos filtros acima, você pode definir sua própria função que recebe um elemento como seu único argumento. A função também precisa retornar True se houver uma correspondência e False por outro lado. Dependendo do que você precisa, você pode tornar a função tão complicada quanto precisa ser para fazer o trabalho. Aqui está um exemplo muito simples:

A função acima está passando pela mesma página Python da Wikipedia e procurando listas não ordenadas que tenham mais de 20 filhos.

Pesquisando na árvore DOM usando funções integradas

Pesquisando com find_all()

Um dos métodos mais populares para pesquisar no DOM é find_all(). Ele passará por todos os descendentes da tag e retornará uma lista de todos os descendentes que correspondem aos seus critérios de pesquisa. Este método tem a seguinte assinatura:

o name argumento é o nome da tag que você deseja que esta função procure enquanto percorre a árvore. Você pode fornecer uma string, uma lista, uma expressão regular, uma função ou o valor True como um nome.

Filtrando por Atributo

Você também pode filtrar os elementos na árvore DOM com base em diferentes atributos como id, hrefetc. Você também pode obter todos os elementos com um atributo específico, independentemente de seu valor, usando attribute=True. Pesquisar elementos com uma classe específica é diferente de pesquisar atributos regulares. Desde a class é uma palavra-chave reservada em Python, você terá que usar o class_ argumento de palavra-chave ao procurar elementos com uma classe específica.

Você pode ver que o documento tem 1.734 tags com um class atributo e 425 tags com um id atributo.

Limitando o número de resultados

Se você precisar apenas dos primeiros resultados, você pode passar um número para o método como o valor de limit. Passar esse valor instruirá a Beautiful Soup a parar de procurar por mais elementos assim que atingir um determinado número. Aqui está um exemplo:

Pesquisa não recursiva

Quando você usa o find_all() método, você está dizendo ao Beautiful Soup para passar por todos os descendentes de uma determinada tag para encontrar o que você está procurando. Às vezes, você deseja procurar um elemento apenas nos filhos diretos de uma tag. Isso pode ser conseguido passando recursive=False ao find_all() método.

Encontrando um único resultado

Se você estiver interessado em encontrar apenas um resultado para uma consulta de pesquisa específica, poderá usar o find() método para encontrá-lo em vez de passar limit=1 para find_all(). A única diferença entre os resultados retornados por esses dois métodos é que find_all() retorna uma lista com apenas um elemento e find() apenas retorna o resultado.

o find() e find_all() métodos pesquisam em todos os descendentes de uma determinada tag para procurar um elemento.

Pesquisas de pais e irmãos

Existem dez outros métodos muito semelhantes que você pode usar para percorrer a árvore DOM em diferentes direções.

o find_parent() e find_parents() métodos percorrem a árvore DOM para encontrar o elemento fornecido. o find_next_sibling() e find_next_siblings() métodos irão iterar sobre todos os irmãos do elemento que vem depois do atual. Da mesma forma, o find_previous_sibling() e find_previous_siblings() métodos irão iterar sobre todos os irmãos do elemento que vêm antes do atual.

o find_next() e find_all_next() métodos irão iterar sobre todas as tags e strings que vêm após o elemento atual. Da mesma forma, o find_previous() e find_all_previous() métodos irão iterar sobre todas as tags e strings que vêm antes do elemento atual.

Pesquisar usando seletores CSS

Você também pode pesquisar elementos usando seletores CSS com a ajuda do select() método. Aqui estão alguns exemplos:

Modificando a árvore

Você pode não apenas pesquisar na árvore DOM para encontrar um elemento, mas também modificá-lo. É muito fácil renomear uma tag e modificar seus atributos.

Deixe um comentário

O seu endereço de e-mail não será publicado.