web-dev-qa-db-fra.com

Python BeautifulSoup XML Parsing

J'ai écrit un script simple pour analyser les journaux de discussion XML à l'aide du module BeautifulSoup. Le soup.prettify () standard fonctionne bien, sauf que les journaux de chat contiennent beaucoup de peluches. Vous pouvez voir à la fois le code du script et une partie du fichier d'entrée XML avec lequel je travaille ci-dessous:

Code

import sys
from BeautifulSoup import BeautifulSoup as Soup

def parseLog(file):
    file = sys.argv[1]
    handler = open(file).read()
    soup = Soup(handler)
    print soup.prettify()

if __name__ == "__main__":
    parseLog(sys.argv[1])

Tester l'entrée XML

<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='MessageLog.xsl'?>
<Log FirstSessionID="1" LastSessionID="2"><Message Date="10/31/2010" Time="3:43:48 PM"     DateTime="2010-10-31T20:43:48.937Z" SessionID="1"><From><User FriendlyName="Jon"/></From>    <To><User FriendlyName="Bill"/></To><Text Style="font-family:Segoe UI; color:#000000; ">hey, what's up?</Text></Message>
<Message Date="10/31/2010" Time="3:44:03 PM" DateTime="2010-10-15T20:44:03.421Z" SessionID="1"><From><User FriendlyName="Jon"/></From><To><User FriendlyName="Bill"/></To><Text Style="font-family:Segoe UI; color:#000000; ">Got your message</Text></Message> 
<Message Date="10/31/2010" Time="3:44:31 PM" DateTime="2010-10-15T20:44:31.390Z" SessionID="2"><From><User FriendlyName="Bill"/></From><To><User FriendlyName="Jon"/></To><Text Style="font-family:Segoe UI; color:#000000; ">oh, great</Text></Message>
<Message Date="10/31/2010" Time="3:44:59 PM" DateTime="2010-10-15T20:44:59.281Z" SessionID="2"><From><User FriendlyName="Bill"/></From><To><User FriendlyName="Jon"/></To><Text Style="font-family:Segoe UI; color:#000000; ">hey, i gotta run</Text></Message>

Je veux pouvoir produire ceci dans un format comme le suivant ou au moins quelque chose qui est plus lisible que le XML pur:

Jon: Hé, quoi de neuf? [31/10/10 @ 3: 43p]

Jon: Vous avez votre message [31/10/10 @ 3: 44p]

Bill: oh, super [31/10/10 @ 3: 44p]

etc. J'ai entendu des choses décentes sur le module PyParsing, peut-être qu'il est temps de lui donner un coup de feu.

18
Caley Woods

BeautifulSoup facilite l'obtention des attributs et des valeurs en xml. J'ai modifié votre exemple de fonction pour utiliser ces fonctionnalités.

import sys
from BeautifulSoup import BeautifulSoup as Soup

def parseLog(file):
    file = sys.argv[1]
    handler = open(file).read()
    soup = Soup(handler)
    for message in soup.findAll('message'):
        msg_attrs = dict(message.attrs)
        f_user = message.find('from').user
        f_user_dict = dict(f_user.attrs)
        print "%s: %s [%s @ %s]" % (f_user_dict[u'friendlyname'],
                                    message.find('text').decodeContents(),
                                    msg_attrs[u'date'],
                                    msg_attrs[u'time'])


if __name__ == "__main__":
    parseLog(sys.argv[1])
32
dcolish

Je recommanderais d'utiliser le module intégré ElementTree . BeautifulSoup est destiné à gérer du code mal formé comme du HTML piraté, tandis que XML est bien formé et destiné à être lu par une bibliothèque XML.

Mise à jour: certaines de mes lectures récentes suggèrent lxml comme une bibliothèque basée sur et améliorant ElementTree standard.

8
Binary Phile