什么是最支持DOM访问的Pythonic XHTML/HTML解析器/生成器/模板模块?

Luk*_*ley 8 python xhtml parsing dom template-engine

它应该能够以高度面向对象的方式创建,修改读取 X/HTML,它仍然感觉DOM喜欢但不肥胖,并且真的是Pythonic.最好它也会处理格式错误的HTML,但我们可以跳过这个模板.

例如,我想这样做:

>> from someAmazingTemplate import *
>> html = Template('<html><head><title>Hi</title></head><body></body></html>')
>> html.head.append('<link type="text/css" href="main.css" rel="stylesheet" />')
>> html.head.title
Hi
>> html['head']['title']
Hi
Run Code Online (Sandbox Code Playgroud)

我应该能够使用/定义短函数并像这样使用它们:

>> html.head.append(stylesheet(href="main.css"))
>> html.body.append(h1('BIG TITLE!12',Class="roflol"))
>> html.body.SOURCE
<body>
    <h1 class="roflol">
        BIG TITLE!12
    </h1>
</body>
Run Code Online (Sandbox Code Playgroud)

注意:如果它不存在,我将使用BSD/MIT/Python许可证.非常欢迎帮助.任何有助于更多Pythonic Web应用程序开发的东西都会很棒.非常感谢!

-Luke Stanley

jat*_*ism 5

第一部分可以在很大程度上由ElementTree完成,但它需要更多的步骤:

>>> import xml.etree.ElementTree as ET
>>> html = ET.XML('<html><head><title>Hi</title></head><body></body></html>')
>>> html.head = html.find('head')
>>> html.head.append(ET.XML('<link type="text/css" href="main.css" rel="stylesheet" />'))
>>> html.head.title = html.head.find('title')
>>> html.head.title.text
'Hi'
Run Code Online (Sandbox Code Playgroud)

第二部分可以通过创建Element对象来完成,但是你需要做一些自己的工作来使它按照你真正想要的方式发生:

>>> html.body = html.find('body')
>>> my_h1 = ET.Element('h1', {'class': 'roflol'})
>>> my_h1.text = 'BIG TITLE!12'
>>> html.body.append(my_h1)
>>> html.body.SOURCE = ET.tostring(html.body)
>>> html.body.SOURCE
'<body><h1 class="roflol">BIG TITLE!12</h1></body>'
Run Code Online (Sandbox Code Playgroud)

你可以创建stylesheet自己的函数:

>>> def stylesheet(href='', type='text/css', rel='stylesheet', **kwargs):
...     elem = ET.Element('link', href=href, type=type, rel=rel) 
...     return elem
... 
>>> html.head.append(stylesheet(href="main.css"))
Run Code Online (Sandbox Code Playgroud)

整个文件:

>>> ET.tostring(html)
<html><head><title>Hi</title><link href="main.css" rel="stylesheet" type="text/css" /></head><body><h1 class="roflol">BIG TITLE!12</h1></body></html>
Run Code Online (Sandbox Code Playgroud)

但是,我认为如果你最终要编写自己的东西,这是一个很好的起点.ElementTree非常强大.

编辑: 我意识到这可能不是你想要的.我只想提供一些可用的替代方案,并证明它实际上可以在没有太多工作的情况下完成.