Ich suche nach einer Möglichkeit, alle in einer XML-Datei verfügbaren Informationen in eine flache Datei oder eine Datenbank zu extrahieren.

Beispielsweise

<r>
                <P>
                    <color val="1F497D"/>
                </P>
                <t val="123" val2="234">TEST REPORT</t>
</r>

Ich würde das als wollen

r
P
color,val,1f497d
t,val,123
t,val2,234

Irgendwelche Hinweise, wie man das in Python macht?

0
Omair . 7 Okt. 2012 im 10:15

3 Antworten

Beste Antwort

Installieren Sie lxml und dann:

>>> from lxml import etree
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> parsed_xml = etree.XML(s,parser)
>>> for i in parsed_xml.iter('*'):
...    print i.tag
...    for x in i.items():
...       print '%s,%s' % (x[0],x[1])
...
r
P
color
val,1F497D
t
val,123
val2,234

Ich überlasse es Ihnen, die Ausgabe zu formatieren.

1
Burhan Khalid 7 Okt. 2012 im 06:41

Ich bin mir nicht sicher, warum Sie das möchten, aber Sie sollten sich lxml oder BeautifulSoup für Python.

Alternativ, wenn Sie es nur in genau der Form haben möchten, die Sie oben dargestellt haben:

def parse_html(html_string):
    import re
    fields = re.findall(r'(?<=\<)[\w=\s\"\']+?(?=\/?\>)', html_string)
    out = []
    for field in fields:
        tag = re.match(r'(?P<tag>\w+?) ?', field).group('tag')
        attrs = re.findall(r' (\w+?)\=[\"\'](.+?)[\"\']', field)
        if attrs:
            for x in attrs:
                out.append(','.join([tag] + list(x)))
        else:
            out.append(tag)

    print '\n'.join(out)

Dies ist etwas übertrieben, und deshalb sollten Sie im Allgemeinen lxml oder BeautifulSoup verwenden, aber es erledigt diese spezielle Aufgabe.

Ausgabe meines obigen Programms:

r
P
c,val,1F497D
t,val,123
t,val2,234
0
jdotjdot 7 Okt. 2012 im 06:49

Ich denke, Ihre beste Wahl ist die Verwendung von BeautifulSoup

Z.B. (aus ihren Dokumenten):

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)
soup.title
# <title>The Dormouse's story</title>
soup.p['class']
# u'title'
for link in soup.find_all('a'):
    print(link.get('href'))
# http://example.com/elsie
# http://example.com/lacie
# http://example.com/tillie

Sie können sich auch lxml ansehen, es ist einfach und effizient und darauf baut BeautifulSoup auf. Insbesondere möchten Sie möglicherweise einen Blick auf diese Seite werfen.

0
Anuj Gupta 7 Okt. 2012 im 06:26