#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’, данные, новая строка=»)