PyMeld

Original Article: PyMeld

Un sistema simple y liviano para manipular HTML (y XML, informalmente) usando un modelo de objetos Pythonic. PyMeld es un único módulo de Python, PyMeld.py.

Caracteristicas:

  • Permite que la lógica del programa y el HTML estén completamente separados: un diseñador gráfico puede diseñar el HTML en un editor visual de HTML, sin necesidad de tratar con ninguna sintaxis no estándar o nombres de atributos no estándar. El código del programa no sabe nada de XML o HTML, solo trata con objetos y atributos como cualquier otra parte del código de Python.
  • Diseñado con tareas comunes de programación de aplicaciones HTML en mente. Llenar un formulario HTML con un registro de una base de datos es un trazador de líneas (usando el operador%, ver a continuación). Crear una tabla HTML a partir de un conjunto de registros es igual de fácil, como se muestra en el siguiente ejemplo.
  • No se requieren requisitos especiales para HTML / XML (o solo uno: los valores de los atributos), por lo que puede usar cualquier editor, y su HTML / XML no necesita ser estrictamente válido.Funciona mediante la sustitución de cadenas, en lugar de descomponer y reconstruir el marcado, por lo tanto no tiene impacto en las partes de la página que no manipulas.
    No hace más que manipular HTML / XML, por lo tanto, encaja con cualquier otro juego de herramientas web que esté utilizando.
  • Los rastreos siempre apuntan al lugar correcto: muchos sistemas de mezcla Python / HTML usan exec o eval, lo que hace que los bugs sean difíciles de rastrear.

Vista rápida

Un objeto PyMeld.Meld representa un documento XML, o una pieza de uno. Todos los elementos en un documento con id = atributos de nombre están disponibles por un objeto Meld como object.name. Los atributos de los elementos están disponibles de la misma manera. Un breve ejemplo vale más que mil palabras:

>>> from PyMeld import Meld
>>> xhtml = '''<html><body>
... <textarea id="message" rows="2" wrap="off">Type your message.</textarea>
... </body></html>'''
>>> page = Meld(xhtml)                # Create a Meld object from XHTML.
>>> print page.message                # Access an element within the document.
<textarea id="message" rows="2" wrap="off">Type your message.</textarea>
>>> print page.message.rows           # Access an attribute of an element.
2
>>> page.message = "New message."     # Change the content of an element.
>>> page.message.rows = 4             # Change an attribute value.
>>> del page.message.wrap             # Delete an attribute.
>>> print page                        # Print the resulting page.
<html><body>
<textarea id="message" rows="4">New message.</textarea>
</body></html>

Por lo tanto, la lógica del programa y el HTML están completamente separados: un diseñador gráfico puede diseñar el HTML en un editor visual XHTML, sin necesidad de tratar con ninguna sintaxis no estándar o nombres de atributos no estándar. El código del programa no sabe nada de XML o HTML, solo trata con objetos y atributos como cualquier otra parte del código de Python. Llenar un formulario HTML con un registro de una base de datos es un trazador de líneas (usando el operador%, ver a continuación). Crear una tabla HTML a partir de un conjunto de registros es igual de fácil, como se muestra en el siguiente ejemplo:

Ejemplo del mundo real:

Aquí hay un ejemplo basado en datos que puebla una tabla de una fuente de datos, basando la tabla en los datos de muestra introducidos por el diseñador de la página. Tenga en cuenta que en el mundo real, el HTML normalmente sería una página más grande leída desde un archivo externo, manteniendo los datos y la presentación por separado, y los datos provendrían de una fuente externa como un RDBMS. El HTML podría estar lleno de estilos, imágenes, cualquier cosa que te guste y todo funcionaría igual.

>>> xhtml = '''<html><table id="people">
... <tr id="header"><th>Name</th><th>Age</th></tr>
... <tr id="row"><td id="name">Example name</td><td id="age">21</td></tr>
... </table></html>'''
>>> doc = Meld(xhtml)
>>> templateRow = doc.row.clone()  # Take a copy of the template row, then
>>> del doc.row                    # delete it to make way for the real rows.
>>> for name, age in [("Richie", 30), ("Dave", 39), ("John", 78)]:
...      newRow = templateRow.clone()
...      newRow.name = name
...      newRow.age = age
...      doc.people += newRow
>>> print re.sub(r'</tr>\s*', '</tr>\n', str(doc))  # Prettify the output
<html><table id="people">
<tr id="header"><th>Name</th><th>Age</th></tr>
<tr id="row"><td id="name">Richie</td><td id="age">30</td></tr>
<tr id="row"><td id="name">Dave</td><td id="age">39</td></tr>
<tr id="row"><td id="name">John</td><td id="age">78</td></tr>
</table></html>

Tenga en cuenta que si posteriormente manipulara la tabla, utilizando PyMeld o JavaScript, por ejemplo, necesitaría cambiar el nombre de cada fila, nombre y elemento de edad para tener un nombre único; puede hacerlo asignando al atributo id pero yo Me salté eso para simplificar el ejemplo.

Como muestra el ejemplo, el operador + = agrega contenido a un elemento, agregando elementos <tr> a una <table> en este caso.

Atajo: el operador%

Usar la sintaxis object.id = value para cada operación puede ser tedioso, por lo que hay atajos que puede tomar usando el operador%. Esto funciona igual que el operador% incorporado para cadenas. El ejemplo anterior podría haberse escrito así:

>>> for name, age in [("Richie", 30), ("Dave", 39), ("John", 78)]:
...      doc.people += templateRow % (name, age)

El operador%, dado un valor único o una secuencia, asigna valores a elementos con `id`s en el orden en que aparecen, al igual que el operador% para cadenas. Tenga en cuenta que no es necesario llamar a clone () cuando usa%, ya que devuelve automáticamente un clon modificado (de nuevo, al igual que% hace para cadenas). También puedes usar un diccionario:

>>> print templateRow % {'name': 'Frances', 'age': 39}
<tr id="row"><td id="name">Frances</td><td id="age">39</td></tr>

El operador% es realmente útil cuando tiene una gran cantidad de elementos de datos; por ejemplo, rellenar un formulario HTML con un registro de un RDBMS se convierte en una sola línea.

Tenga en cuenta que estos ejemplos se escriben por claridad en lugar de por rendimiento, y no necesariamente se escalan muy bien: usar + = para generar un resultado en un ciclo es ineficiente, y el operador% de PyMeld es más lento que el de Python. Consulte toFormatString () en el manual de referencia para conocer las formas de acelerar este tipo de código.

Contenido del elemento

Cuando te refieres a un elemento nombrado en un documento, obtienes un objeto Meld que representa ese elemento completo:

>>> page = Meld('<html><span id="x">Hello world</span></html>')
>>> print page.x
<span id="x">Hello world</span>

Si solo desea obtener el contenido del elemento como una cadena, use el atributo _content:

>>> print page.x._content
Hello world

También puedes asignar a _content,aunque eso es directamente equivalente a la asignación a la etiqueta en sí:

>>> page.x._content = "Hello again"
>>> print page
<html><span id="x">Hello again</span></html>
>>> page.x = "Goodbye"
>>> print page
<html><span id="x">Goodbye</span></html>

La única vez que necesita asignar a _contentes cuando ha tomado una referencia a un elemento dentro de un documento:

>>> x = page.x
>>> x._content = "I'm back"
>>> print page
<html><span id="x">I'm back</span></html>

Diciendo x = "I'm back" simplemente volvería a vincular x a la cuerda"I'm back" sin afectar el documento.

Leave a Reply

Your email address will not be published. Required fields are marked *