2010-11-01 37 views
11

Tôi đã viết một kịch bản đơn giản để phân tích cú pháp nhật ký trò chuyện XML bằng mô-đun BeautifulSoup. Tiêu chuẩn soup.prettify() hoạt động ok ngoại trừ các bản ghi trò chuyện có rất nhiều lông tơ trong chúng. Bạn có thể nhìn thấy cả hai mã kịch bản và một số các tập tin đầu vào XML Tôi đang làm việc với bên dưới:Python Phân tích cú pháp XML của BeautifulSoup

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

thử nghiệm XML Input

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

Tôi muốn có thể xuất kết quả này thành định dạng như sau hoặc ít nhất một thứ có thể đọc được nhiều hơn XML thuần túy:

Jon: Xin chào, có chuyện gì vậy? [10/31/10 @ 3: 43p]

Jon: Got thông điệp của bạn [10/31/10 @ 3: 44p]

Bill: oh, tuyệt vời [10/31/10 @ 3 : 44p]

vv .. Tôi đã nghe một số điều thú vị về mô-đun PyParsing, có lẽ đã đến lúc cho nó một cảnh quay.

+1

Tại sao không XSLT? Đó sẽ là cách dễ nhất. (Trong thực tế: tôi thấy có một chỉ thị? Xml-stylesheet - biểu định kiểu mặc định trông như thế nào?) –

+0

Tôi có thể không luôn có biểu định kiểu XSL, do đó cần phải có thứ gì đó để định dạng nhật ký thành thứ gì đó dễ đọc hơn một chút . Nếu tôi có thể sử dụng cùng một bản định kiểu giống như tôi có, điều đó cũng có thể hoạt động. –

Trả lời

24

BeautifulSoup tạo các thuộc tính và giá trị trong xml thực sự đơn giản. Tôi đã tinh chỉnh chức năng ví dụ của bạn để sử dụng các tính năng này.

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

Điều này hoạt động hoàn hảo. Những gì chính xác được chứa trong từ điển từ f_user_dict = dict (f_user.attrs) Tôi giả định các thuộc tính, tôi sẽ phải chơi với mảnh đó và xem chính xác những gì ở đó. Cảm ơn một lần nữa! –

+0

Yup cho tất cả các yếu tố, el.attrs sẽ chứa một danh sách các bộ dữ liệu thuộc tính thẻ xml. Gọi dict trên bất kỳ tuple sẽ làm cho nó thành một từ điển. – dcolish

+1

Oh chỉ muốn làm rõ, gọi dict trên một danh sách các bộ dữ liệu sẽ trả về một từ điển, không phải một tuple đơn lẻ: dict ([('hello', 'goodbye'), ('foo', 'bar')]) – dcolish

6

Tôi khuyên bạn nên sử dụng mô-đun tích hợp ElementTree. BeautifulSoup có nghĩa là xử lý các mã chưa được tạo hình như bị tấn công HTML, trong khi XML được định dạng tốt và có nghĩa là được đọc bởi một thư viện XML.

Cập nhật: một số lần đọc gần đây của tôi ở đây gợi ý lxml như một thư viện được xây dựng và nâng cao tiêu chuẩn ElementTree.

+6

Tôi sử dụng Beautiful Soup để phân tích cú pháp XML. Từ các tài liệu: "Beautiful Soup là một thư viện Python để lấy dữ liệu ra khỏi các tệp HTML và XML." Beautiful Soup sẽ sử dụng bất kỳ trình phân tích cú pháp nào bạn cho biết, bao gồm lxml. (xem http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser) – lfalin

+0

Và gần đây tôi đã thấy nhiều chuỗi XML bị tạo dạng không đúng định dạng. – whatnick

Các vấn đề liên quan