将 xml 文件中的数据提取到数据框中

Extracting data from a xml file into a dataframe

我正在尝试从 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> ```

高亮区域是我要获取的数据

所以,这是我的代码:

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 文件中没有任何字符串像这样。怎么回事?

注意:您忘记在结尾 revista

之前关闭一个部分 processo

问题是您没有使代码适应 xml 文件的结构。

你得到一个 \n 因为 node.find('despachos').text 给你 despachos 中包含的文本。然而,其中没有 真正的 文本,只有 \n 后跟空格。 Pandas 将按原样显示,不进行任何解析。您必须申请 node.find('despachos').text.rstrip() 才能避免这种情况。

此外,在 despachos 中,您有一个名为 despacho 的子节点,它是一个封闭标签,因此同样没有文本。但是,它有两个属性 codigonome,您可以将它们用作 processo。例如:

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

它在第一个节点 despachos 中找到第一个节点 despacho,然后提取属性 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