tokenize
模块理解您的输入格式:行包含有效的 Python 标识符,语句的缩进级别很重要。ElementTree
模块允许您在内存中操作树结构,因此将树的创建与将其呈现为 html 分离可能更灵活:
from tokenize import NAME, INDENT, DEDENT, ENDMARKER, NEWLINE, generate_tokens
from xml.etree import ElementTree as etree
def parse(file, TreeBuilder=etree.TreeBuilder):
tb = TreeBuilder()
tb.start('ul', {})
for type_, text, start, end, line in generate_tokens(file.readline):
if type_ == NAME: # convert name to <li> item
tb.start('li', {})
tb.data(text)
tb.end('li')
elif type_ == NEWLINE:
continue
elif type_ == INDENT: # start <ul>
tb.start('ul', {})
elif type_ == DEDENT: # end </ul>
tb.end('ul')
elif type_ == ENDMARKER: # done
tb.end('ul') # end parent list
break
else: # unexpected token
assert 0, (type_, text, start, end, line)
return tb.close() # return root element
任何提供.start()
, .end()
, .data()
,.close()
方法的类都可以用作TreeBuilder
例如,您可以只动态编写 html 而不是构建树。
要解析标准输入并将 html 写入标准输出,您可以使用ElementTree.write()
:
import sys
etree.ElementTree(parse(sys.stdin)).write(sys.stdout, method='html')
输出:
<ul><li>A</li><ul><li>B</li><li>C</li><ul><li>D</li><li>E</li></ul></ul></ul>
您可以使用任何文件,而不仅仅是sys.stdin/sys.stdout
.
注意:要在 Python 3 上写入标准输出,sys.stdout.buffer
或者encoding="unicode"
由于字节/Unicode 的区别。