Como analisar arquivos XML usando o belo grupo de Python

Como analisar arquivos XML usando o belo grupo de Python

Os dados estão literalmente em todo lugar, em todos os tipos de documentos. Mas nem tudo é útil, daí a necessidade de analisá -lo para obter as peças necessárias. Os documentos XML são um desses documentos que mantê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 para analisar arquivos XML. Eles são:

  • Encontrando tags
  • Extraindo de tags

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

Instalação

BeautifulSoup é uma das bibliotecas mais usadas quando se trata de raspar a web com Python. Como os arquivos XML são semelhantes aos arquivos HTML, também é capaz de analisá -los. Para analisar os arquivos XML usando o BeautifulSoup, é melhor que você use o Python's 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 estão instaladas com sucesso, você pode ativar o shell interativo e tentar importar ambos. Se nenhum erro surgir, você estará pronto para ir 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 bit (AMD64)] no Win32
Digite "ajuda", "direitos autorais", "créditos" ou "licença" para obter mais informações.
>>> Importar BS4
>>> importar lxml
>>>

Antes de seguir em frente, você deve criar um arquivo XML a partir do trecho de código abaixo. É bastante simples e deve se adequar aos casos de uso que você aprenderá no restante do artigo. Basta copiar, cole em seu editor e salve; um nome como amostra.xml deve ser suficiente.



A árvore

Primeiro
Segundo

Terceiro

Um
Dois
Gêmeos


Quarto

Agora, em seu script python; Você precisar. O restante deste artigo fará uso do BS_CONTENT variável, então é importante que você dê este passo.

# Importar beautifulsoup
de BS4 Import BeautifulSoup como BS
Content = []
# Leia o arquivo XML
com open ("amostra.xml "," r ") como arquivo:
# Leia cada linha no arquivo, readLines () retorna uma lista de linhas
Content = arquivo.ReadLines ()
# Combine as linhas da lista em uma string
content = "".Junte -se (conteúdo)
bs_content = bs (conteúdo, "lxml")

A amostra de código acima das importações Belo grupo, Em seguida, ele lê o arquivo XML como um arquivo regular. Depois disso, passa o conteúdo para o importado Belo grupo biblioteca, bem como o analisador de escolha.

Você notará que o código não importa lxml. Não precisa como Belo grupo vai escolher o lxml analisador como resultado da passagem "LXML" no objeto.

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

Encontrando tags

Um dos estágios mais importantes da análise de arquivos XML está procurando 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 por:

  • Nomes
  • Relacionamentos

Encontrar tags por nomes

Existem dois métodos de belo grupo que você pode usar ao encontrar tags por nomes. No entanto, os casos de uso diferem; Vamos dar uma olhada neles.

encontrar

Da experiência pessoal, você usará o encontrar método com mais frequência do que os outros métodos para encontrar tags neste artigo. A tag de localização recebe o nome da tag que você deseja obter e retorna um objeto de belo grupo da tag se encontrar uma; caso contrário, ele retorna Nenhum.

Aqui está um exemplo:

>>> resultado = bs_content.encontre ("dados")
>>> Imprimir (resultado)
Um
>>> resultado = bs_content.encontre ("exclusivo")
>>> Imprimir (resultado)
Gêmeos
>>> resultado = bs_content.encontre ("pai")
>>> Imprimir (resultado)
Nenhum
>>> resultado = bs_content.encontre ("mãe")
>>> Imprimir (resultado)
Nenhum

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

Por exemplo, quando encontre ("dados") foi chamado, ele só retornou a primeira etiqueta de dados, mas não retornou os outros.

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

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

encontrar tudo

O encontrar tudo o método é bastante semelhante ao encontrar 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 ("Child")
>>> 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 encontrar e encontrar tudo Métodos, você pode procurar tags em qualquer lugar do documento XML. No entanto, você pode tornar suas pesquisas mais poderosas.

Aqui está como:

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

Veja isso:

>>> resultado = bs_content.encontre ("filho", "name": "rose")
>>> Imprimir (resultado)
Segundo
>>> resultado = bs_content.Find_all ("Child", "Name": "Rose")
>>> Imprimir (resultado)
[[Segundo]
>>> resultado = bs_content.encontre ("filho", "name": "Jack")
>>> Imprimir (resultado)
Primeiro
>>> resultado = bs_content.Find_all ("Child", "Nome": "Jack")
>>> Imprimir (resultado)
[[Primeiro]

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

Quando você passa em um dicionário como um segundo parâmetro, o encontrar e encontrar tudo Métodos ainda mais sua pesquisa para obter tags que possuem atributos e valores que se encaixam na chave fornecida: par de valores.

Por exemplo, apesar de usar o encontrar método no primeiro exemplo, ele retornou o segundo criança tag (em vez do primeiro criança 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.

Encontrar tags por relacionamentos

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

Existem três relacionamentos principais nos documentos XML:

  • Pai: A tag na qual a etiqueta de referência existe.
  • Crianças: As tags que existem na etiqueta de referência.
  • Irmãos: As tags que existem no mesmo nível que a tag de referência.

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

Dê uma olhada neste:

>>> terceiro_child = bs_content.encontre ("filho", "name": "Blue Ivy")
>>> Imprimir (terceiro_child)

Terceiro

Um
Dois
Gêmeos

A partir da amostra de código acima, a etiqueta de referência para o restante desta seção será o terceiro criança tag, armazenado em um terceiro_child variável. Nas subseções abaixo, você verá como procurar tags com base em seus pais, irmão e relacionamento com os filhos com a tag de referência.

Encontrando pais

Para encontrar a etiqueta pai de uma tag de referência, você usará o pai atributo. Fazer isso retorna a etiqueta pai, bem como as tags embaixo dela. Esse comportamento é bastante compreensível, já que as tags de crianças fazem parte da tag pai.

Aqui está um exemplo:

>>> resultado = terceiro_child.pai
>>> Imprimir (resultado)

Primeiro
Segundo

Terceiro

Um
Dois
Gêmeos


Quarto

Encontrando crianças

Para encontrar as tags infantis de uma tag de referência, você usará o crianças atributo. Fazer isso retorna as tags das crianças, bem como as sub-marcas sob cada uma delas. Esse comportamento também é compreensível, pois as tags de crianças geralmente têm tags de seus próprios filhos.

Uma coisa que você deve observar é que o crianças atributo retorna as tags de crianças como gerador. Portanto, se você precisar de uma lista das tags de crianças, terá que converter o gerador em uma lista.

Aqui está um exemplo:

>>> resultado = list (terceiro_child.crianças)
>>> Imprimir (resultado)
['\ n terceiro \ n',
Um
Dois
Gêmeos
, '\ n']

Se você analisar mais de perto o exemplo acima, você notará que alguns valores na lista não são tags. Isso é algo que você precisa observar.

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

Encontrando irmãos

O último nesta seção é encontrar tags que são irmãos para a etiqueta de referência. Para cada etiqueta de referência, pode haver tags de irmãos antes e depois. O anterior_siblings o atributo retornará as tags de irmãos antes da etiqueta de referência, e o NEXT_SIBLINGS atributo retornará as tags de irmãos depois dele.

Assim como o crianças atributo, o anterior_siblings e NEXT_SIBLINGS Atributos retornarão geradores. Então você precisa se converter em uma lista se precisar de uma lista de irmãos.

Dê uma olhada neste:

>>> anterior_siblings = list (terceiro_child.anterior_siblings)
>>> Imprimir (Anterior_siblings)
['\ n', Segundo, '\ n',
Primeiro, '\ n']
>>> next_siblings = list (terceiro_child.next_siblings)
>>> Imprimir (Next_siblings)
['\ n', Quarto]
>>> Imprimir (Anterior_siblings + Next_siblings)
['\ n', Segundo, '\ n', Primeiro,
'\ n', '\ n', Quarto, '\ n']

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

Extraindo de tags

Ao analisar documentos XML, muito do trabalho está em encontrar as tags certas. No entanto, quando você os encontrar, você também pode extrair determinadas informações dessas tags, e é isso que esta seção lhe ensinará.

Você verá como extrair o seguinte:

  • Valores do atributo de tag
  • Texto da tag
  • Conteúdo de tag

Extraindo valores de atributo de tags

Às vezes, você pode ter um motivo para extrair os valores para atributos em uma tag. No emparelhamento de valor de atributo a seguir, por exemplo: Nome = ”Rose”, Você pode querer extrair “Rose.”

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

Aqui está um exemplo:

>>> resultado = terceiro_child.Get ("Nome")
>>> Imprimir (resultado)
Ivy azul
>>> resultado = terceiro_child ["nome"]
>>> Imprimir (resultado)
Ivy azul

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é as tags das crianças. No entanto, o texto O atributo os devolverá como uma única string, concatenada; enquanto o cordas o atributo os devolverá como um gerador que você pode converter em uma lista.

Aqui está um exemplo:

>>> resultado = terceiro_child.texto
>>> Imprimir (resultado)
'\ n terceiro \ n \ nenhum \ ntwo \ ntwins \ n \ n'
>>> resultado = list (terceiro_child.cordas)
>>> Imprimir (resultado)
['\ n terceiro \ n', '\ n', 'um', '\ n', 'dois', '\ n', 'gêmeos', '\ n', '\ n']

Extraindo o conteúdo da tag

Além disso, extraindo os valores do atributo e o texto da tag, você também pode extrair todo o conteúdo de uma tags. Para fazer isso, você pode usar o conteúdo atributo; é um pouco semelhante ao crianças atribuir 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_child.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 o BeautifulSoup. Mas se você perceber, quando você imprimir 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, isso 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_child)

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 tag durante a impressão, e você terá algo visualmente agradável.

Dê uma olhada neste:

Conclusão

A análise de documentos é um aspecto importante do fornecimento de dados. Os documentos XML são bastante populares e espero que você esteja melhor equipado para aceitá -los e extrair os dados que deseja.

A partir deste artigo, agora você pode:

  • Procure tags por nomes ou relacionamentos
  • Extraia dados de tags

Se você se sentir bastante perdido e é bastante novo na biblioteca de belos grupos, pode conferir o tutorial do belo grupo para iniciantes.