Преобразование XML в csv с использованием python xml или simplified_scrapy

#python-3.x #xml

Вопрос:

Я пытаюсь преобразовать 1 XML — файл в CSV/xls. Я попробовал приведенный ниже код, но, похоже, он не работает. Я должен получить частоту центра для «Имени узла», роль которого = База. Ниже приведен пример XML https://pastebin.com/Ln4Ug0hN

 from bs4 import BeautifulSoup
import pandas as pd
import lxml
import xml.etree.cElementTree
import openpyxl
import inspect
import os
import tkinter
from tkinter import filedialog

root = tkinter.Tk()
dirname = filedialog.askopenfilename(parent=root, initialdir="/",
                                    title='Please select a file')




root = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

sites = "xmll.xml"

with open(sites, "r",encoding='unicode_escape') as f:
    xml_data = f.read()

soup = BeautifulSoup(xml_data, "xml")
#ss=soup.find_all("NodeName").text
# 'INAPKVLIVGLRTW6001ENBIB5004'


tag1 = input("Enter tagname1:")
tag2 = input("Enter tagname2:")
# in a loop

data = []
dd = []

for td in soup.find_all(tag1):
    data.append({"Name": td.text})
    
for snmp in soup.find_all(tag2):
    dd.append({"CentreFrequency": snmp.text})

df1 = pd.DataFrame(data)
df2 = pd.DataFrame(dd)
    
df = pd.merge(df1,df2,left_index=True, right_index=True)
 
 

Ответ №1:

Я нашел очень простую библиотеку для использования XML в CVS от одного из пользователей с именем «simplified_scrapy», Ниже приведено решение, которое вы можете попробовать

 from simplified_scrapy import SimplifiedDoc, utils, req
import inspect
import time
import os
import pandas as pd

def delEmptyRows(name, encoding="utf-8"):
    lines = utils.getFileLines(name, encoding=encoding)
    lines = [line for line in lines if line.strip()!='']
    utils.saveFile(name, "".join(lines), encoding=encoding)

root = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))

xml = utils.getFileContent(root  '/xml.xml')
#xml = open('mumbai2.xml','r').read
doc = SimplifiedDoc(xml)
lstNodeResult = doc.selects('IBridge2ConfigResult')
data = [['NodeName','CenterFrequency']]

for result in lstNodeResult:
    lstrole = result.selects('IBridge2Config>Role')

    frequency =  result.CenterFrequency.text       
    NodeName = result.NodeName.text
    row = [NodeName,frequency]

    if NodeName !=' ':    
        data.append(row)
    # print (data)
    utils.save2csv('Frequency_List.csv',data)
    delEmptyRows('Frequency_List.csv')



 

Комментарии:

1. Спасибо @Sonu, это сработало Имя узла Частота центра INTNTAFUXXXXNB0001ENTI21001 INTNMIPRXXXXTW6011ENBI21001 5745 INTNMLDRKMJRTW0001ENBI21001 5865

2. Если вы используете параметр новой строки, вам не нужно дополнительно удалять:) utils.save2csv(‘Frequency_List.csv’, данные, новая строка=»)