English 中文(简体)
What s the most Pythonic XHTML/HTML parser/generator/template module that supports DOM like access?
原标题:

It should be able to create, modify and read X/HTML in a highly object oriented way that still feels DOM like but is not obese, and is really Pythonic. Preferably it would deal with malformed HTML too, but we can skip this for templates.

For example, I d like to do this:

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

I should be able to use/define short functions and use them like this:

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

Note: If it doesn t exist, I m going to make it under BSD/MIT/Python license. Help is most welcome. Anything that works towards more Pythonic web app development will be great. Very much appreciate it!

-Luke Stanley

最佳回答

The first part can for the most part be done by ElementTree, but it takes a few more steps:

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

The second part can be completed by creating Element objects, but you d need to do some of your own work to make it happen the way you really want:

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

You could create a stylesheet function of your own:

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

And the whole document:

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

But, I think if you re going to end up writing your own thing, this is a good place to start. ElementTree is very powerful.

Edit: I realize that this is probably not exactly what you re looking for. I just wanted to provide something as an available alternative and to also prove that it could actually be done without too much work.

问题回答

Amara Bindery provides the most Pythonic XML API I ve seen. See the quick reference, manual and faq





相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签