Para iniciantes em web scraping com BeautifulSoup, um artigo que discute os conceitos de web scraping com esta poderosa biblioteca pode ser encontrado aqui.
Este artigo é para programadores, analistas de dados, cientistas ou engenheiros que já possuem o conjunto de habilidades para extrair conteúdo de páginas da web usando BeautifulSoup. Se você não tem nenhum conhecimento dessa biblioteca, aconselho que consulte o tutorial do BeautifulSoup para iniciantes.
Agora podemos prosseguir - quero acreditar que você já tem esta biblioteca instalada. Caso contrário, você pode fazer isso usando o comando abaixo:
pip instalar BeautifulSoup4Uma vez que estamos trabalhando com a extração de dados de HTML, precisamos ter uma página HTML básica para praticar esses conceitos em. Para este artigo, usaríamos este snippet de HTML para praticar. Vou atribuir o seguinte snippet de HTML a uma variável usando as aspas triplas em Python.
sample_content = "" "
Para fazer uma lista não ordenada, a tag ul é usada:
- Primeira opção
- Segunda opçao
Aqui está uma lista não ordenada
Para fazer uma lista ordenada, a tag ol é usada:
- Número um
- Número dois
Aqui está uma lista ordenada
Dica de Linux, 2018
"" "
Agora que resolvemos isso, vamos começar a trabalhar com a biblioteca BeautifulSoup.
Faremos uso de alguns métodos e atributos que chamaríamos em nosso objeto BeautifulSoup. No entanto, precisaríamos analisar nossa string usando BeautifulSoup e, em seguida, atribuir a uma variável “our_soup”.
de bs4 import BeautifulSoup como bsoour_soup = bso (amostra_content, "lxml")
Daí em diante, estaríamos trabalhando com a variável "nosso_soup" e chamando todos os nossos atributos ou métodos nela.
Em uma nota rápida, se você ainda não sabe o que é um nó filho, é basicamente um nó (tag) que existe dentro de outro nó. Em nosso snippet de HTML, por exemplo, as tags li são nós filhos das tags “ul” e “ol”.
Aqui estão os métodos que veríamos:
- findChild
- findChildren
- conteúdo
- crianças
- descendentes
findChild ():
O findChild método é usado para encontrar o primeiro nó filho de elementos HTML. Por exemplo, quando examinamos nossas tags “ol” ou “ul”, encontraríamos duas tags filhas nelas. No entanto, quando usamos o findChild método, ele só retorna o primeiro nó como o nó filho.
Este método pode ser muito útil quando queremos obter apenas o primeiro nó filho de um elemento HTML, pois ele retorna o resultado necessário imediatamente.
O objeto retornado é do tipo bs4.elemento.Marcação. Podemos extrair o texto dele chamando o atributo de texto nele.
Aqui está um exemplo:
first_child = our_soup.find ("corpo").find ("ol")imprimir (first_child.findChild ())
O código acima retornaria o seguinte:
Para obter o texto da tag, chamamos o texto Atributo nele.
Como:
imprimir (first_child.findChild ().texto)Para obter o seguinte resultado:
'Número um'findChildren ():
Nós demos uma olhada no findChild método e vi como funciona. O findChildren método funciona de maneira semelhante, no entanto, como o nome indica, ele não encontra apenas um nó filho, ele obtém todos os nós filhos em uma tag.
Quando você precisa obter todos os nós filhos em uma tag, o findChildren método é o caminho a percorrer. Este método retorna todos os nós filhos em uma lista, você pode acessar a tag de sua escolha usando seu número de índice.
Aqui está um exemplo:
first_child = our_soup.find ("corpo").find ("ol")imprimir (first_child.findChildren ())
Isso retornaria os nós filhos em uma lista:
[Para obter o segundo nó filho da lista, o código a seguir faria o trabalho:
imprimir (first_child.findChildren () [1])Para obter o seguinte resultado:
Isso é tudo que a BeautifulSoup oferece quando se trata de métodos. No entanto, não termina aí. Os atributos também podem ser chamados em nossos objetos BeautifulSoup para obter o nó filho / filho / descendente de um elemento HTML.
conteúdo:
Enquanto o findChildren método fez o trabalho simples de extrair os nós filhos, o conteúdo atributos faz algo um pouco diferente.
O conteúdo atributo retorna uma lista de todo o conteúdo em um elemento HTML, incluindo os nós filhos. Então, quando você chama o conteúdo atributo em um objeto BeautifulSoup, ele retornaria o texto como strings e os nós nas tags como um bs4.elemento.Marcação objeto.
Aqui está um exemplo:
first_child = our_soup.find ("corpo").find ("ol")imprimir (first_child.conteúdo)
Isso retorna o seguinte:
["\ n Aqui está uma lista ordenada \ n",'\ n',
Como você pode ver, a lista contém o texto que vem antes de um nó filho, o nó filho e o texto que vem depois do nó filho.
Para acessar o segundo nó filho, tudo o que precisamos fazer é usar seu número de índice, conforme mostrado abaixo:
imprimir (first_child.conteúdo [3])Isso retornaria o seguinte:
crianças:
Aqui está um atributo que faz quase a mesma coisa que o atributo de conteúdo. No entanto, tem uma pequena diferença que pode causar um grande impacto (para aqueles que levam a otimização de código a sério).
O atributo filhos também retorna o texto que vem antes de um nó filho, o próprio nó filho e o texto que vem depois do nó filho. A diferença aqui é que ele os retorna como um gerador em vez de uma lista.
Vamos dar uma olhada no seguinte exemplo:
first_child = our_soup.find ("corpo").find ("ol")imprimir (first_child.crianças)
O código acima fornece os seguintes resultados (o endereço em sua máquina não precisa corresponder ao abaixo):
Como você pode ver, ele retorna apenas o endereço do gerador. Poderíamos converter este gerador em uma lista.
Podemos ver isso no exemplo abaixo:
first_child = our_soup.find ("corpo").find ("ol")print (list (first_child).crianças))
Isso dá o seguinte resultado:
["\ n Aqui está uma lista ordenada \ n",'\ n',
descendentes:
Enquanto o crianças atributo funciona em obter apenas o conteúdo dentro de uma tag i.e. o texto e nós no primeiro nível, o descendentes atributo vai mais fundo e faz mais.
O descendentes atributo obtém todo o texto e nós que existem nos nós filhos. Portanto, ele não retorna apenas nós filhos, ele retorna nós netos também.
Além de retornar o texto e as tags, ele também retorna o conteúdo das tags como strings também.
Assim como o crianças atributo, descendentes retorna seus resultados como um gerador.
Podemos ver isso abaixo:
first_child = our_soup.find ("corpo").find ("ol")imprimir (first_child.descendentes)
Isso dá o seguinte resultado:
Como visto anteriormente, podemos converter esse objeto gerador em uma lista:
first_child = our_soup.find ("corpo").find ("ol")print (list (first_child).descendentes))
Gostaríamos de obter a lista abaixo:
["\ n Aqui está uma lista ordenada \ n",'Número Um', '\ n',
Conclusão
Aí está, cinco maneiras diferentes de acessar nós filhos em elementos HTML. Pode haver mais maneiras, no entanto, com os métodos e atributos discutidos neste artigo, deve-se ser capaz de acessar o nó filho de qualquer elemento HTML.