Вы можете использовать BeautifulSoup, чтобы вернуть все элементы, которые вы хотите одновременно.Затем вы можете определить, какой из них возвращается, используя elem.name
, и создать необходимую информацию для каждой строки.Поскольку label
стоит последним, вы можете использовать его для записи выходной строки.
Python имеет библиотеку CSV , чтобы помочь вам в этом.Он принимает список значений и правильно форматирует его как строку вывода.Обычно вам не нужно добавлять кавычки ко всему, но, поскольку ваш ожидаемый результат имеет это, вы можете добавить quoting=csv.QUOTE_ALL
, чтобы заставить его добавить его ко всем значениям.
itemgetter()
это просто полезная функция, которая может извлечь требуемые элементы из данных Python, например, списка или словаря за один вызов.
from bs4 import BeautifulSoup
from operator import itemgetter
import csv
credential_fields = ['name', 'host', 'username', 'info', 'type', 'url', 'email']
get_fields = itemgetter(*credential_fields)
with open('test.xml') as f_input:
soup = BeautifulSoup(f_input, 'xml')
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output, delimiter=';', quoting=csv.QUOTE_ALL)
csv_output.writerow(credential_fields + ['notes', 'label'])
for elem in soup.find_all(['notes', 'credential', 'label']):
if elem.name == 'notes':
note = elem.get_text(strip=True).replace('\n', ' ')
elif elem.name == 'credential':
credential = list(get_fields(elem))
else:
label = elem['id']
csv_output.writerow(credential + [note, label])
Это даст вам выходной формат:
"name";"host";"username";"info";"type";"url";"email";"notes";"label"
"somename";"somehost";"someusername";"someinfo";"LDAP";"3423";"33454";"";"1"
"somename2";"somehost2";"someusername2";"someinfo2";"LDAP";"12";"34";"some noteasdasdasd";"4"