2009-11-16 15 views
8

Il devrait être en mesure de créer , modifier et lire X/HTML dans une très manière orientée objet qui se sent encore comme DOM, mais ne sont pas obèses, et est vraiment Pythonic. De préférence, il traiterait aussi du HTML malformé, mais nous pouvons passer à côté des templates.Quel est le module d'analyse/syntaxe XHTML/HTML de Pythonic le plus compatible avec l'accès DOM?

Par exemple, je voudrais faire:

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

je devrais pouvoir utiliser/définir des fonctions à court et à les utiliser comme ceci:

>> 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: S'il doesn n'existe pas, je vais le faire sous licence BSD/MIT/Python. L'aide est la bienvenue. Tout ce qui fonctionne pour le développement d'applications Web Pythonic sera formidable. J'apprécie beaucoup!

-Luc Stanley

+0

Amara Bindery, pyWeb et BeautifulSoup sont à l'étude. Je pense que je vais devoir les emballer ensemble pour obtenir quelque chose de vraiment élégant. –

+0

exemple ElementTree de SynAck montre une très bonne base aussi, je posterai ici –

Répondre

5

La première partie peut, pour la plupart être fait par ElementTree, mais il faut quelques étapes:

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

La deuxième partie peut être complétée par la création d'objets Element, mais vous auriez besoin de faire un peu de votre propre travail pour y arriver la façon dont vous voulez vraiment:

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

vous pouvez créer une fonction stylesheet de votre propre:

>>> 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 le document entier:

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

Mais, je pense que si vous allez finir par écrire votre propre chose, c'est un bon endroit pour commencer. ElementTree est très puissant.

Editer: Je réalise que ce n'est probablement pas exactement ce que vous cherchez. Je voulais juste fournir quelque chose comme une alternative disponible et aussi prouver que cela pourrait être fait sans trop de travail.

+0

Très merci beaucoup Synack. Je vais essayer de voir si je peux mettre ça dans ce que j'ai spécifié avec des wrappers. Voulez-vous être tenu au courant? Je posterai un suivi ici. –

+0

Absolument, j'aimerais voir comment ça se passe. Je pense que cela semble amusant. – jathanism

+0

Je l'utilise en fait dans le cadre d'un MVC. Je veux l'utiliser comme modèle intermédiaire. Je n'ai rien contre l'utilisation de langues de gabarit aussi bien. Si combiné avec PyJS (Pyjamas), il pourrait être une bête assez puissante. Je veux aussi utiliser un peu JQuery. –

1

Amara Bindery fournit l'API XML plus Pythonic que je l'ai vu. Voir la quick reference, manual et faq

+0

progrès pourrait être une bonne base, grâce Quark! * enquêter * –

+0

Vous savez que cela semble le plus prometteur maintenant que j'ai eu plus de temps pour le comparer. Il insère Au début de mon HTML cependant. Je cherche une solution maintenant.Je –

+0

compilé la dernière version, puis cela a fonctionné: >>> import de amara * >>> doc = parse (' Salut') >>> print doc.xml_encode ((» html-tiret ")) Salut plus d'exemples et l'emballage plus tard –