将 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 & 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
的子节点,它是一个封闭标签,因此同样没有文本。但是,它有两个属性 codigo
和 nome
,您可以将它们用作 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
我正在尝试从 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 & 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
的子节点,它是一个封闭标签,因此同样没有文本。但是,它有两个属性 codigo
和 nome
,您可以将它们用作 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