Categorias
codificação

Diferentes maneiras de analisar Python BeautifulSoup

Enquanto estudava Python, tentei organizar várias maneiras de obter tags específicas de documentos html.

Código de exemplo HTML

Assumindo que existe um documento HTML como segue, vamos ver como analisar tags específicas usando o módulo BeautifulSoup uma a uma.

from bs4 import BeautifulSoup

html = """
<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <span class='test1'>Content1</span>
        <div class='test1'>Content2</div>
        <div class='test1' id='target' name='sangminem'>Goal</div>
        <div class='test2'>Content3</div>
    </body>
</html>
"""

soup = BeautifulSoup(html, "html.parser")

O objetivo é a tag abaixo.

<div class='test1' id='target' name='sangminem'>Goal</div>

Use o método find()

print(soup.find('div',id='target')) #tag, id
print(soup.find('div',attrs={'id':'target'})) #tag, id as attribute value
print(soup.find('div',attrs={'name':'sangminem'})) #tag, name as attribute value
print(soup.find(attrs={'name':'sangminem'})) #name as attribute value
print(soup.find(attrs={'id':'target'})) #id as attribute value

Aqui está a saída.

<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>

Utilize o método find_all()

print(soup.find_all('div')[1]) #tag
print(soup.find_all('div',class_=['test1'])[1]) #tag, class
print(soup.find_all('div',id='target')[0]) #tag, id
print(soup.find_all('div',attrs={'class':'test1'})[1]) #tag, class as attribute value
print(soup.find_all('div',attrs={'id':'target'})[0]) #tag, id as attribute value
print(soup.find_all('div',attrs={'name':'sangminem'})[0]) #name as attribute value
print(soup.find_all(class_=['test1'])[2]) #class
print(soup.find_all(id='target')[0]) #id
print(soup.find_all(attrs={'class':'test1'})[2]) #class as attribute value
print(soup.find_all(attrs={'id':'target'})[0]) #id as attribute value
print(soup.find_all(attrs={'name':'sangminem'})[0]) #name as attribute value

Aqui está a saída.

<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>

Utilize o método select_one()

print(soup.select_one('div.test1#target')) #tag, class, id
print(soup.select_one('div#target')) #tag, id
print(soup.select_one('.test1#target')) #class, id
print(soup.select_one('#target')) #id

Aqui está a saída.

<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>

Use o método select()

print(soup.select('.test1')[2]) #class
print(soup.select('div.test1')[1]) #tag, class
print(soup.select('div.test1#target')[0]) #tag, class, id
print(soup.select('div#target')[0]) #tag, id
print(soup.select('.test1#target')[0]) #class, id
print(soup.select('#target')[0]) #id

Aqui está a saída.

<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>
<div class="test1" id="target" name="sangminem">Goal</div>

O método find() e o método select_one() obtêm um único resultado.

Se houver vários resultados que satisfaçam a condição, apenas o primeiro valor será recuperado.

Os métodos find_all() e select() obtêm todos os resultados que satisfazem a condição na forma de um array.

Portanto, para finalmente obter o valor desejado, você não deve omitir o índice do array.

Se for difícil decidir qual usar porque existem vários métodos, recomendamos usar o método select().

É fácil de usar e realmente analisa mais rápido.

Deixe uma resposta

O seu endereço de email não será publicado.

pt_PTPortuguês