我需要以这种丑陋的格式解析一些日志文件 (任意数量的明文标题,其中一些标题在xml中获得了额外的数据):
[dd/mm/yy]:message_data
<starttag>
<some_field>some_value</some_field>
....
</starttag>
[dd/mm/yy]:message_data
[dd/mm/yy]:message_data
....
到目前为止,我的方法是:
message_text = None
for line in LOGFILE:
message_start_match = MESSAGE_START_RE.search(line)
if not message_start_match:
header_info = HEADER_RE.search(line)
if message_start_match:
message_text = line
continue
if message_text:
message_text += line
if MESSAGE_END_RE.search(line):
process_message_with_xml_parser(message_text, header_info)
message_text=None
其中
MESSAGE_START_RE = re.compile(r"<starttag.*>)
MESSAGE_END_RE = re.compile(r"</starttag>)
header_info is a regex with named fields of the message
你知道更好的方法吗?
这个方法的问题是:我有点用正则表达式解析xml(这是愚蠢的)。是否有任何包可以识别文件中xml的开始和结束?
答案 0 :(得分:1)
您仍然可以在丑陋的xml上使用BeautifulSoup
。这是一个例子:
from bs4 import BeautifulSoup
data = """[dd/mm/yy]:message_data
<starttag>
<some_field>some_value</some_field>
....
</starttag>
[dd/mm/yy]:message_data
[dd/mm/yy]:message_data"""
soup = BeautifulSoup(data);
starttag = soup.findAll("starttag")
for tag in starttag:
print tag.find("some_field").text
# => some_value