xml2csv с python / BeautifulSoup - PullRequest
       4

xml2csv с python / BeautifulSoup

0 голосов
/ 20 сентября 2018

Мне нужно преобразовать файл XML в CSV, я немного попробовал с BeautifulSoup, но мои знания Python практически отсутствуют.Я немного устал, но это далеко.

#!/usr/bin/env python3
from bs4 import BeautifulSoup

# infile = open("test.xml","r")
# data = infile.read()
data = """<ROOT>
<SUB1>
  <credential id='3' name='somename' host='somehost' username='someusername' info='someinfo' type='LDAP' opSys='' url='3423' email='33454'>
    <notes />
    <label id='1' />
  </credential>
<credential id='3' name='somename2' host='somehost2' username='someusername2' info='someinfo2' type='LDAP' opSys='' url='12' email='34'>
    <notes>some note
asdasdasd </notes>
      <label id='4' />
    </credential>
  </SUB1>
</ROOT>"""
soup = BeautifulSoup(data,'xml')

# export as csv, should look like this
# name;host;username;info;type;url;email;notes;label
# "somename";"somehost";"someusername";"someinfo";LDAP;"3423;"33454";"";1
# "somenane2";"somehost2";"someusername2";"someinfo2";LDAP;"12";"34";"somenote asdasdasd";4


print("name;host;username;info;type;url;email;notes;label")



notes = soup.find_all('notes')
for notes in notes:
    if notes == "":
        print("")
    else:
        notes = notes.get_text('\n', '')
        print(notes)

Может ли кто-нибудь дать несколько советов?

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете использовать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...