2014-06-16 118 views
1

我用python解析一個300頁的文檔,我需要找出ThisVal元素後的Response元素的屬性值。有多個點,其中Response元素用於differentVals,所以我需要在找到ThisVal元素後找出Responseelements屬性值中的內容。用標籤解析Python文本文件

如果有幫助,令牌對於ThisVal是唯一的,但在每個文檔中都不相同。

11:44:49 <ThisVal Token="5" /> 
11:44:49 <Response Token="5" Code="123123" elements="x.one,x.two,x.three,x.four,x.five,x.six,x.seven" /> 
+0

刪除時間戳(例如使用'awk')並使用http://www.crummy.com/software/BeautifulSoup/bs4/doc/進行嘗試。 –

+0

謝謝,這是有幫助的,但問題是在「thisval」後面找到它有100個響應標籤,但我需要一個匹配特定元素的IE「thisval」 – user2569803

回答

1

您是否考慮過使用pyparsing?我發現它對這種事情非常有用。以下是我對解決您的問題的嘗試。

import pyparsing as pp 

document = """11:44:49 <ThisVal Token="5" /> 
11:44:49 <Response Token="5" Code="123123" elements="x.one,x.two,x.three,x.four,x.five,x.six,x.seven" /> 
""" 

num = pp.Word(pp.nums) 
colon = ":" 

start = pp.Suppress("<") 
end = pp.Suppress("/>") 
eq = pp.Suppress("=") 

tag_name = pp.Word(pp.alphas)("tag_name") 

value = pp.QuotedString("\"") 

timestamp = pp.Suppress(num + colon + num + colon + num) 
other_attr = pp.Group(pp.Word(pp.alphas) + eq + value) 

tag = start + tag_name + pp.ZeroOrMore(other_attr)("attr") + end 

tag_line = timestamp + tag 

thisval_found = False 

for line in document.splitlines(): 

    result = tag_line.parseString(line) 
    print("Tag: {}\nAttributes: {}\n".format(result.tag_name, result.attr)) 

    if thisval_found and tag_name == "Response": 
     for a in result.attr: 
      if a[0] == "elements": 
       print("FOUND: {}".format(a[1])) 

    thisval_found = result.tag_name == "ThisVal"