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

标签 python dom xhtml parsing 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

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

>> 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>

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

-卢克·斯坦利

最佳答案

第一部分大部分可以由 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'

第二部分可以通过创建 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>'

您可以创建自己的样式表函数:

>>> 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"))

以及整个文档:

>>> 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>

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

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

关于python - 支持类 DOM 访问的最 Pythonic XHTML/HTML 解析器/生成器/模板模块是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1745524/

相关文章:

3 秒后启动的 JavaScript 事件处理程序

javascript - 如何仅针对鼠标事件而不是键盘选项卡式导航删除 anchor 链接的虚线焦点轮廓?

python - 如何禁用任何使用我的功能的 pylint 检查?

python - 在 python 字符串中插入这些破折号的最快方法?

python - 使用两个或多个列表进行聚类

javascript - 更新 JS 以使用 IE10

python - 在 Azure 中运行 Python 脚本的选项

php - 使用 PHP 简单 DOM 解析器查找直接后代

html - IE 不支持 XHTML 但仍有许多人使用它,这是真的吗?

php - 在 PHP 上使用正则表达式获取 HTML 页面 &lt;input&gt; 值和名称