BeautifulSoup

Como analisar arquivos XML usando BeautifulSoup do Python

Como analisar arquivos XML usando BeautifulSoup do Python
Os dados estão literalmente em todos os lugares, em todos os tipos de documentos. Mas nem tudo é útil, daí a necessidade de analisá-lo para obter as partes necessárias. Documentos XML são um desses documentos que contêm dados. Eles são muito semelhantes aos arquivos HTML, pois têm quase o mesmo tipo de estrutura. Portanto, você precisará analisá-los para obter informações vitais, assim como faria ao trabalhar com HTML.

Existem dois aspectos principais na análise de arquivos XML. Eles são:

Você precisará encontrar a tag que contém as informações desejadas e, em seguida, extrair essas informações. Você aprenderá a fazer as duas coisas ao trabalhar com arquivos XML antes do final deste artigo.

Instalação

BeautifulSoup é uma das bibliotecas mais usadas quando se trata de web scraping com Python. Uma vez que os arquivos XML são semelhantes aos arquivos HTML, também é capaz de analisá-los. No entanto, para analisar arquivos XML usando BeautifulSoup, é melhor que você use o Python lxml analisador.

Você pode instalar as duas bibliotecas usando o pip ferramenta de instalação, através do comando abaixo:

pip install bs4 lxml

Para confirmar que ambas as bibliotecas foram instaladas com sucesso, você pode ativar o shell interativo e tentar importar ambos. Se nenhum erro for exibido, você está pronto para prosseguir com o resto do artigo.

Aqui está um exemplo:

$ python
Python 3.7.4 (tags / v3.7.4: e09359112e, 8 de julho de 2019, 20:34:20)
[MSC v.1916 64 bits (AMD64)] no win32
Digite "ajuda", "direitos autorais", "créditos" ou "licença" para obter mais informações.
>>> import bs4
>>> importar lxml
>>>

Antes de prosseguir, você deve criar um arquivo XML a partir do trecho de código abaixo. É muito simples e deve se adequar aos casos de uso que você aprenderá no restante do artigo. Simplesmente copie, cole em seu editor e salve; um nome como amostra.xml deve bastar.



A árvore

Primeiro
Segundo

Terceiro

Um
Dois
gêmeos


Quarto

Agora, em seu script Python; você precisará ler o arquivo XML como um arquivo normal e, em seguida, passá-lo para o BeautifulSoup. O restante deste artigo fará uso do bs_content variável, por isso é importante que você dê este passo.

# Import BeautifulSoup
de bs4 import BeautifulSoup como bs
content = []
# Leia o arquivo XML
com open ("amostra.xml "," r ") como arquivo:
# Leia cada linha do arquivo, readlines () retorna uma lista de linhas
content = arquivo.readlines ()
# Combine as linhas da lista em uma string
content = "".juntar (conteúdo)
bs_content = bs (conteúdo, "lxml")

O exemplo de código acima importa BeautifulSoup, então ele lê o arquivo XML como um arquivo normal. Depois disso, ele passa o conteúdo para o importado BeautifulSoup biblioteca, bem como o analisador de escolha.

Você notará que o código não importa lxml. Não tem que ser BeautifulSoup vai escolher o lxml analisador como resultado da passagem “Lxml” no objeto.

Agora, você pode prosseguir com o resto do artigo.

Localizando Tags

Um dos estágios mais importantes da análise de arquivos XML é a pesquisa de tags. Existem várias maneiras de fazer isso ao usar o BeautifulSoup; então você precisa saber sobre alguns deles para ter as melhores ferramentas para a situação apropriada.

Você pode encontrar tags em documentos XML:

Localização de tags por nomes

Existem dois métodos BeautifulSoup que você pode usar ao encontrar tags por nomes. No entanto, os casos de uso são diferentes; vamos dar uma olhada neles.

achar

Por experiência pessoal, você usará o achar método com mais frequência do que os outros métodos para localizar tags neste artigo. A tag find recebe o nome da tag que você deseja obter e retorna um objeto BeautifulSoup da tag se encontrar um; senão, ele retorna Nenhum.

Aqui está um exemplo:

>>> resultado = bs_content.find ("dados")
>>> imprimir (resultado)
Um
>>> resultado = bs_content.find ("único")
>>> imprimir (resultado)
gêmeos
>>> resultado = bs_content.find ("pai")
>>> imprimir (resultado)
Nenhum
>>> resultado = bs_content.find ("mãe")
>>> imprimir (resultado)
Nenhum

Se você der uma olhada no exemplo, verá que o achar método retorna uma tag se corresponder ao nome, caso contrário, retorna Nenhum. No entanto, se você olhar mais de perto, verá que ele retorna apenas uma única tag.

Por exemplo, quando find (“dados”) foi chamado, ele retornou apenas a primeira tag de dados, mas não retornou as outras.

PEGUEI VOCÊS: O achar método retornará apenas a primeira tag que corresponda à sua consulta.

Então, como você encontra outras tags também? Isso nos leva ao próximo método.

encontrar tudo

O encontrar tudo método é bastante semelhante ao achar método. A única diferença é que ele retorna uma lista de tags que correspondem à sua consulta. Quando não encontra nenhuma tag, simplesmente retorna uma lista vazia. Por isso, encontrar tudo sempre retornará uma lista.

Aqui está um exemplo:

>>> resultado = bs_content.find_all ("dados")
>>> imprimir (resultado)
[Um, Dois]
>>> resultado = bs_content.find_all ("filho")
>>> imprimir (resultado)
[Primeiro, Segundo,
Terceiro

Um
Dois
gêmeos

, Quarto]
>>> resultado = bs_content.find_all ("pai")
>>> imprimir (resultado
[]
>>> resultado = bs_content.find_all ("mãe")
>>> imprimir (resultado)
[]

Agora que você sabe como usar o achar e encontrar tudo métodos, você pode pesquisar tags em qualquer lugar no documento XML. No entanto, você pode tornar suas pesquisas mais eficientes.

Veja como:

Algumas tags podem ter o mesmo nome, mas atributos diferentes. Por exemplo, o filho tags têm um nome atributo e valores diferentes. Você pode fazer pesquisas específicas com base nesses.

Veja isso:

>>> resultado = bs_content.find ("criança", "nome": "Rosa")
>>> imprimir (resultado)
Segundo
>>> resultado = bs_content.find_all ("criança", "nome": "Rosa")
>>> imprimir (resultado)
[Segundo]
>>> resultado = bs_content.find ("criança", "nome": "Jack")
>>> imprimir (resultado)
Primeiro
>>> resultado = bs_content.find_all ("filho", "nome": "Jack")
>>> imprimir (resultado)
[Primeiro]

Você verá que há algo diferente sobre o uso do achar e encontrar tudo métodos aqui: ambos têm um segundo parâmetro.

Quando você passa um dicionário como um segundo parâmetro, o achar e encontrar tudo métodos aprofundam sua pesquisa para obter tags que possuem atributos e valores que se encaixam no par chave: valor fornecido.

Por exemplo, apesar de usar o achar método no primeiro exemplo, ele retornou o segundo filho tag (em vez da primeira filho tag), porque essa é a primeira tag que corresponde à consulta. O encontrar tudo tag segue o mesmo princípio, exceto que retorna todas as tags que correspondem à consulta, não apenas a primeira.

Localização de tags por relacionamento

Embora menos popular do que pesquisar por nomes de tag, você também pode pesquisar tags por relacionamentos. No sentido real, porém, é mais navegar do que pesquisar.

Existem três relacionamentos principais em documentos XML:

A partir da explicação acima, você pode inferir que a tag de referência é o fator mais importante na busca de tags por relacionamentos. Portanto, vamos procurar a tag de referência e continuar o artigo.

Dê uma olhada neste:

>>> third_child = bs_content.find ("child", "name": "Blue Ivy")
>>> imprimir (terceiro_criança)

Terceiro

Um
Dois
gêmeos

No exemplo de código acima, a tag de referência para o restante desta seção será a terceira filho tag, armazenada em um terceiro_criança variável. Nas subseções abaixo, você verá como pesquisar tags com base na relação pai, irmão e filho com a tag de referência.

Encontrando Pais

Para encontrar a tag pai de uma tag de referência, você usará o pai atributo. Isso retorna a tag pai, bem como as tags abaixo dela. Este comportamento é bastante compreensível, uma vez que as tags filhas fazem parte da tag pai.

Aqui está um exemplo:

>>> resultado = terceiro_criança.pai
>>> imprimir (resultado)

Primeiro
Segundo

Terceiro

Um
Dois
gêmeos


Quarto

Encontrando Filhos

Para encontrar as tags filhas de uma tag de referência, você usará o crianças atributo. Isso retorna as tags filhas, bem como as sub tags em cada uma delas. Esse comportamento também é compreensível, já que as tags filhas geralmente têm suas próprias tags filhas também.

Uma coisa que você deve notar é que o crianças atributo retorna as tags filhas como um gerador. Então, se você precisa de uma lista das tags filhas, você terá que converter o gerador em uma lista.

Aqui está um exemplo:

>>> resultado = lista (terceiro_criança.crianças)
>>> imprimir (resultado)
['\ n Terceiro \ n',
Um
Dois
gêmeos
, '\ n']

Se você der uma olhada no exemplo acima, você notará que alguns valores na lista não são tags. Isso é algo que você precisa estar atento.

PEGUEI VOCÊS: O crianças atributo não retorna apenas as tags filhas, ele também retorna o texto na tag de referência.

Encontrando Irmãos

O último desta seção é encontrar tags que são irmãs da tag de referência. Para cada tag de referência, pode haver tags irmãs antes e depois dela. O irmãos_antes atributo retornará as tags irmãs antes da tag de referência, e o irmãos_próximos atributo retornará as tags irmãs após ele.

Assim como o crianças atributo, o irmãos_antes e irmãos_próximos atributos retornarão geradores. Então você precisa converter para uma lista se precisar de uma lista de irmãos.

Dê uma olhada neste:

>>> irmãos_antes = lista (terceiro_criança.irmãos_antes)
>>> imprimir (irmãos_antes)
['\ n', Segundo, '\ n',
Primeiro, '\ n']
>>> next_siblings = list (third_child.next_siblings)
>>> imprimir (next_siblings)
['\ n', Quarto]
>>> imprimir (irmãos_antes + irmãos_ próximos)
['\ n', Segundo, '\ n', Primeiro,
'\ n', '\ n', Quarto, '\ n']

O primeiro exemplo mostra os irmãos anteriores, o segundo mostra os próximos irmãos; então, ambos os resultados são combinados para gerar uma lista de todos os irmãos para a tag de referência.

Extraindo de tags

Ao analisar documentos XML, muito do trabalho reside em encontrar as tags certas. No entanto, ao encontrá-los, você também pode querer extrair certas informações dessas tags, e é isso que esta seção vai lhe ensinar.

Você verá como extrair o seguinte:

Extraindo valores de atributo de tag

Às vezes, você pode ter um motivo para extrair os valores dos atributos em uma tag. No seguinte emparelhamento de atributo-valor, por exemplo: nome = ”Rosa”, você pode querer extrair “Rose.”

Para fazer isso, você pode usar o obter método ou acessando o nome do atributo usando [] como um índice, assim como faria ao trabalhar com um dicionário.

Aqui está um exemplo:

>>> resultado = terceiro_criança.get ("nome")
>>> imprimir (resultado)
Blue Ivy
>>> resultado = terceiro_criança ["nome"]
>>> imprimir (resultado)
Blue Ivy

Extraindo o texto da tag

Quando você deseja acessar os valores de texto de uma tag, você pode usar o texto ou cordas atributo. Ambos retornarão o texto em uma tag, e até mesmo as tags filhas. No entanto, o texto attribute os retornará como uma única string, concatenada; enquanto o cordas atributo irá retorná-los como um gerador que você pode converter em uma lista.

Aqui está um exemplo:

>>> resultado = terceiro_criança.texto
>>> imprimir (resultado)
'\ n Terceiro \ n \ nUm \ nDuas \ nDuas \ n \ n'
>>> resultado = lista (terceiro_criança.cordas)
>>> imprimir (resultado)
['\ n Terceiro \ n', '\ n', 'Um', '\ n', 'Dois', '\ n', 'Gêmeos', '\ n', '\ n']

Extraindo o conteúdo da tag

Além de extrair os valores dos atributos e o texto da tag, você também pode extrair todo o conteúdo das tags. Para fazer isso, você pode usar o conteúdo atributo; é um pouco semelhante ao crianças atributo e produzirá os mesmos resultados. No entanto, enquanto o crianças atributo retorna um gerador, o conteúdo atributo retorna uma lista.

Aqui está um exemplo:

>>> resultado = terceiro_criança.conteúdo
>>> imprimir (resultado)
['\ n Terceiro \ n',
Um
Dois
gêmeos
, '\ n']

Impressão bonita

Até agora, você viu alguns métodos e atributos importantes que são úteis ao analisar documentos XML usando BeautifulSoup. Mas se você notar, quando você imprime as tags na tela, elas têm algum tipo de aparência agrupada. Embora a aparência possa não ter um impacto direto na sua produtividade, pode ajudá-lo a analisar com mais eficácia e tornar o trabalho menos tedioso.

Aqui está um exemplo de impressão da maneira normal:

>>> imprimir (terceiro_criança)

Terceiro

Um
Dois
gêmeos

No entanto, você pode melhorar sua aparência usando o embelezar método. Basta ligar para o embelezar método na etiqueta durante a impressão, e você obterá algo visualmente agradável.

Dê uma olhada neste:

Conclusão

A análise de documentos é um aspecto importante do sourcing de dados. Documentos XML são muito populares e, com sorte, você está melhor equipado para aceitá-los e extrair os dados que deseja.

A partir deste artigo, você agora é capaz de:

Se você se sentir perdido e for novo na biblioteca do BeautifulSoup, consulte o tutorial do BeautifulSoup para iniciantes.

Batalha por Wesnoth 1.13.6 Desenvolvimento lançado
Batalha por Wesnoth 1.13.6 lançado no mês passado, é o sexto lançamento de desenvolvimento no 1.13.série x e oferece uma série de melhorias, principal...
Como instalar o League Of Legends no Ubuntu 14.04
Se você é fã de League of Legends, esta é uma oportunidade para testar o funcionamento de League of Legends. Observe que LOL é suportado no PlayOnLinu...
Instale o último jogo de estratégia OpenRA no Ubuntu Linux
OpenRA é um motor de jogo de estratégia em tempo real Libre / Free que recria os primeiros jogos Westwood como o clássico Command & Conquer: Red Alert...