tokenize
module瞭解您的輸入格式:行包含有效的Python標識符,語句的縮進級別非常重要。 ElementTree
module讓您操作的樹結構在內存中,因此可能會更flexable從渲染爲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的stdout,請使用sys.stdout.buffer
或encoding="unicode"
,這是由於字節/ Unicode的區別。
來源
2012-08-28 19:56:42
jfs