Извлечение данных из файла xml в фрейм данных - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь извлечь некоторые данные из файла xml, вот пример из файла (он довольно большой).

```<?xml version="1.0" encoding="UTF-8" ?>
<revista numero="2558" data="14/01/2020">
  <processo numero="909359539" data-deposito="11/05/2015" data-concessao="14/01/2020" data-vigencia="14/01/2030">
    <despachos>
      <despacho codigo="IPAS158" nome="Concessão de registro"/>
    </despachos>
    <titulares>
      <titular nome-razao-social="DISTRIBUIDORA DE SUPERGELADOS REGIONAIS LTDA" pais="BR" uf="SP"/>
    </titulares>
    <marca apresentacao="Mista" natureza="De Serviço">
      <nome>DSR DISTRIBUIDORA DE SUPERGELADOS REGIONAIS</nome>
    </marca>
    <classes-vienna edicao="4">
      <classe-vienna codigo="24.1.15"/>
      <classe-vienna codigo="27.5.1"/>
    </classes-vienna>
    <lista-classe-nice>
      <classe-nice codigo="35">
        <especificacao>Administração de negócios, comercialização através de qualquer meio de produtos alimentícios, em especial, picolé, sorvetes, gelados comestíveis, sobremesas congeladas; franchising; representação comercial; serviços de distribuição, representação, importação e exportação de produtos alimentícios, em especial, picolé, sorvetes, gelados comestíveis, sobremesas congeladas; assessoria em gestão comercial ou industrial.; </especificacao>
        <status>Deferido</status>
      </classe-nice>
    </lista-classe-nice>
    <procurador>Vaz e Dias Advogados &amp; Associados</procurador>
  </processo>
  <processo numero="826455069" data-deposito="12/03/2004" data-concessao="14/01/2020" data-vigencia="14/01/2030">
    <despachos>
      <despacho codigo="IPAS158" nome="Concessão de registro"/>
    </despachos>
    <titulares>
      <titular nome-razao-social="ESCOLA CASINHA BRANCA DE UBERLÂNDIA LTDA-ME" pais="BR" uf="MG"/>
    </titulares>
    <marca apresentacao="Mista" natureza="De Serviço">
      <nome>CASINHA BRANCA</nome>
    </marca>
    <classes-vienna edicao="4">
      <classe-vienna codigo="7.1.8"/>
      <classe-vienna codigo="27.5.1"/>
    </classes-vienna>
    <lista-classe-nice>
      <classe-nice codigo="41">
        <especificacao>escola maternal, jardim e pré escola (ensino infantil).; </especificacao>
        <status>Deferido</status>
      </classe-nice>
    </lista-classe-nice>
    <procurador>CIDWAN UBERLÂNDIA LTDA ME</procurador>
 </revista> ```

Выделенные области - это данные, которые я хочу получить

The Highlighted areas are the data I want to get

Итак, вот мой код:

xtree = et.parse("/content/drive/My Drive/data/INPI/RM2558.xml")
xroot = xtree.getroot()df_cols = ['Processo', 'Despacho', 'Titular', 'Marca', 'Procurador']
rows =[]
for node in xroot:
  processo = node.attrib.get('numero')
  despacho = node.find('despachos')
  titular = node.find('titulares')
  marca = node.find('nome')
  procurador = node.find('procurador')

  rows.append({'Processo':processo, 'Despacho':despacho, 'Titular':titular, 'Marca':marca,'Procurador':procurador})

rpi_df = pd.DataFrame(rows, columns= df_cols)

Команда head () дает мне следующее:

     Processo   Despacho    Titular     Marca   Procurador
0   909359539   [[]]      [[]]         None           []
1   826455069   [[]]      [[]]         None           []
2   916823270   [[]]      [[]]         None           []
3   916625303   [[]]      [[]]         None           []
4   916626873   [[]]      [[]]         None           None  

«Processo» работает нормально, но «Despacho», «Titular» и «Procurador» дают мне эти скобки, а «Marca» не получает мне данных, это все нулевые значения.

Я преобразовал все в строки, чтобы увидеть, какими будут эти скобки, и получил это

Processo    Despacho    Titular     Marca   Procurador
0   909359539   <Element 'despachos' at 0x7fb47f082b38>     <Element 'titulares' at 0x7fb47f08e1d8>     None    <Element 'procurador' at 0x7fb47f08e548>
1   826455069   <Element 'despachos' at 0x7fb47f08e5e8>     <Element 'titulares' at 0x7fb47f08e688>     None    <Element 'procurador' at 0x7fb47f08e9f8>
2   916823270   <Element 'despachos' at 0x7fb47f08ea98>     <Element 'titulares' at 0x7fb47f08eb38>     None    <Element 'procurador' at 0x7fb47f08eea8>
3   916625303   <Element 'despachos' at 0x7fb47f08ef48>     <Element 'titulares' at 0x7fb47f099048>     None    <Element 'procurador' at 0x7fb47f0994a8>
4   916626873   <Element 'despachos' at 0x7fb47f099548>     <Element 'titulares' at 0x7fb47f0995e8>     None    None

Так что я думаю, что это адреса данных в файле xml, верно?

Моя следующая попытка была такой:

df_cols = ['Processo', 'Despacho', 'Titular', 'Marca', 'Procurador']
rows =[]
for node in xroot:
  processo = node.attrib.get('numero')
  despacho = node.find('despachos').text if node.find('despachos') is not None else None
  titular = node.find('titulares').text if node.find('titulares') is not None else None
  marca = node.find('marca').text if node.find('marca') is not None else None
  procurador = node.find('procurador').text if node.find('procurador') is not None else None

  rows.append({'Processo':processo, 'Despacho':despacho, 'Titular':titular, 'Marca':marca, 'Procurador':procurador})

rpi_df = pd.DataFrame(rows, columns= df_cols)

И я получил это

Processo       Despacho     Titular     Marca   Procurador
0   909359539   \n           \n         \n     Vaz e Dias Advogados & Associados
1   826455069   \n           \n         \n     CIDWAN UBERLÂNDIA LTDA ME
2   916823270   \n           \n         \n     Wettor - Bureau de Apoio Empresarial S/S Ltda. ME
3   916625303   \n           \n         \n     Lilian de Melo Silveira Advogados Associados S/C
4   916626873   \n           \n         \n     None

Теперь «Procurador» также работает «и я получаю некоторые данные» Marca ", но что с" / n "? Нигде в файле xml нет такой строки. Что происходит?

1 Ответ

1 голос
/ 16 января 2020

Примечание: вы забыли закрыть раздел processo до окончания revista

Проблема в том, что вы не адаптировали код к структуре файла xml.

Вы получаете \n, потому что node.find('despachos').text дает вам текст, содержащийся в despachos. Тем не менее, в нем нет реального текста, просто \n, за которым следуют пробелы. Pandas покажет это как есть, без разбора. Чтобы избежать этого, вы должны применить node.find('despachos').text.rstrip().

Кроме того, в despachos у вас есть один дочерний узел с именем despacho, который является закрытым тегом, поэтому опять нет текста. Однако он имеет два атрибута codigo и nome, которые можно использовать как для processo. Например:

node.find('despachos').find('despacho').attrib.get('nome')

Он находит первый узел despacho в первом узле despachos, а затем извлекает атрибут nome.

Я предположил, что вы хотели что-то подобное :

import xml.etree.ElementTree as et
import pandas as pd

xtree = et.parse("test.xml")
xroot = xtree.getroot()
df_cols = ['Processo', 'Despacho', 'Titular', 'Marca', 'Procurador']
rows = []
for node in xroot:
    processo = node.attrib.get('numero')
    despacho = node.find('despachos').find('despacho').attrib.get('nome')
    titular = node.find('titulares').find('titular').attrib.get('nome-razao-social')
    marca = node.find('marca').find('nome').text
    procurador = node.find('procurador').text
    rows.append({'Processo':processo, 'Despacho':despacho, 'Titular':titular, 'Marca':marca, 'Procurador':procurador})

pd.DataFrame(rows, columns= df_cols)
    Processo    Despacho    Titular Marca   Procurador
0   909359539   Concessão de registro   DISTRIBUIDORA DE SUPERGELADOS REGIONAIS LTDA    DSR DISTRIBUIDORA DE SUPERGELADOS REGIONAIS Vaz e Dias Advogados & Associados
1   826455069   Concessão de registro   ESCOLA CASINHA BRANCA DE UBERLÂNDIA LTDA-ME CASINHA BRANCA  CIDWAN UBERLÂNDIA LTDA ME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...