2010-11-01 32 views
11

BeautifulSoup modülünü kullanarak XML sohbet günlüklerini ayrıştırmak için basit bir komut dosyası yazdım. Standart soup.prettify(), sohbet günlüklerinin içinde çok fazla havlanma olması dışında tamam çalışır.Python BeautifulSoup XML Ayrıştırma

Kod

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]) 

Test XML Girdi ben

<?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> 

: Sen komut kodu ve aşağıda ile çalışıyorum XML girdi dosyasının bazı görebildiğinizden Bunu, aşağıdaki gibi bir biçime veya en azından salt XML'den daha okunabilir bir şeye dönüştürmek istemek:

Jon: Hey, n'aber? [10/31/10 3 @: 43P]

Jon: @ 3 oh harika [10/31/10:

Bill: Mesajınızı [44P 10/31/10 3 @] Got : 44p]

vb. PyParsing modülü hakkında bazı iyi şeyler duydum, belki de ona bir şans vermenin zamanı geldi.

+1

Neden XSLT? Bu en kolay olurdu. (Aslında: "xml-stylesheet direktifinin olduğunu görüyoruz - varsayılan stil sayfası neye benziyor?) –

+0

Her zaman XSL stil sayfasının mevcut olmayabilir, bu yüzden bir şeyleri biraz daha okunabilir bir şeye biçimlendirmek için ihtiyaç duyuyoruz . Aynı stil sayfasını sahip olduğum gibi kullanabiliyorsam, bu da işe yarayabilir. –

cevap

24

BeautifulSoup, xml'deki özniteliklere ve değerlere ulaşmayı gerçekten basitleştirir. Bu özellikleri kullanmak için örnek işlevinizi değiştirdim.

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]) 
+1

Bu mükemmel çalışır. f_user_dict = dict (f_user.attrs) Sözlüğünde tam olarak ne var? Öznitelik varsayalım, o parça ile oyuncak olmalı ve tam olarak orada ne olduğunu görmeliyim. Tekrar teşekkürler! –

+0

Tüm öğeler için, el.attr'ler xml etiketlerinin özniteliklerinin bir listesini içerecektir. Herhangi bir tuple çağrılması, onu bir sözlük haline getirecektir. – dcolish

+1

Oh sadece açıklığa kavuşturmak istedim, bir tuple listesinde bir dict çağrısı, bir sözlük döndürecektir, tek bir tuple değil: dict ([('merhaba', 'hoşçakalın'), ('foo', 'bar')]) – dcolish

6

Yerleşik ElementTree modülünü kullanmanızı öneririz. BeautifulSoup, hacklenmiş HTML gibi hacklenmiş kodları işlemek içindir, XML ise iyi biçimlendirilmiş ve bir XML kütüphanesi tarafından okunması gerektiği anlamına gelir.

Güncelleme: Son zamanlardaki okumalarımın bir kısmı, standart ElementTree'yi geliştiren ve geliştiren bir kitaplık olarak lxml'yi önerir.

+6

XML'i ayrıştırmak için Beautiful Soup kullanıyorum. Dokümanlar: "Güzel Çorba, HTML ve XML dosyalarından veri çekmeye yarayan bir Python kütüphanesidir." Güzel Çorba, lxml de dahil olmak üzere söylediğin ayrıştırıcıyı kullanır. (bkz. http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser) – lfalin

+0

Son zamanlarda çok sayıda dize kaynaklı hatalı biçimlendirilmiş XML gördüm. – whatnick