XIST examples

An introduction to XIST by examples

Home › Python software › ll.xist › ExamplesText · XIST

Creating HTML

You can create and output HTML like this:

from ll.xist import xsc
from ll.xist.ns import html, xml, meta

node = xsc.Frag(
·  xml.XML(),
·  html.DocTypeXHTML10transitional(),
·  html.html(
·  ·  html.head(
·  ·  ·  meta.contenttype(),
·  ·  ·  html.title("Example page")
·  ·  ),
·  ·  html.body(
·  ·  ·  html.h1("Welcome to the example page"),
·  ·  ·  html.p(
·  ·  ·  ·  "This example page has a link to the ",
·  ·  ·  ·  html.a("Python home page", href="http://www.python.org/"),
·  ·  ·  ·  "."
·  ·  ·  )
·  ·  )
·  )
)

print node.conv().bytes(encoding="us-ascii")

You can also use with blocks (and the unary + operator) to generate the same HTML:

from ll.xist import xsc
from ll.xist.ns import html, xml, meta

with xsc.build():
·  with xsc.Frag() as node:
·  ·  +xml.XML()
·  ·  +html.DocTypeXHTML10transitional()
·  ·  with html.html():
·  ·  ·  with html.head():
·  ·  ·  ·  +meta.contenttype()
·  ·  ·  ·  +html.title("Example page")
·  ·  ·  with html.body():
·  ·  ·  ·  +html.h1("Welcome to the example page")
·  ·  ·  ·  with html.p():
·  ·  ·  ·  ·  +xsc.Text("This example page has a link to the ")
·  ·  ·  ·  ·  with html.a():
·  ·  ·  ·  ·  ·  with xsc.addattr("href"):
·  ·  ·  ·  ·  ·  ·  +xsc.Text(""http://www.python.org/"")
·  ·  ·  ·  ·  ·  +xsc.Text("Python home page")
·  ·  ·  ·  ·  +xsc.Text(".")

print node.conv().bytes(encoding="us-ascii")

Defining new elements

You can define new elements and how they should be converted to HTML (or other XML vocabularies) like this:

from ll.xist import xsc
from ll.xist.ns import html, xml, meta

class cheeseshoplink(xsc.Element):
·  class Attrs(xsc.Element.Attrs):
·  ·  class name(xsc.TextAttr): pass

·  def convert(self, converter):
·  ·  e = html.a(
·  ·  ·  self.attrs.name,
·  ·  ·  href=("http://cheeseshop.python.org/pypi/", self.attrs.name)
·  ·  )
·  ·  return e.convert(converter)

names = ["ll-xist", "cx_Oracle", "PIL"]

node = xsc.Frag(
·  xml.XML(),
·  html.DocTypeXHTML10transitional(),
·  html.html(
·  ·  html.head(
·  ·  ·  meta.contenttype(),
·  ·  ·  html.title("Cheeseshop links")
·  ·  ),
·  ·  html.body(
·  ·  ·  html.h1("Cheeseshop links"),
·  ·  ·  html.ul(html.li(cheeseshoplink(name=name)) for name in names)
·  ·  )
·  )
)

print node.conv().bytes(encoding="us-ascii")

Parsing HTML

Parsing HTML is done like this:

from ll.xist import parsers

node = parsers.parseurl("http://www.python.org/", tidy=True)

Finding and counting nodes

The following example shows you how to output the URLs of all images inside links on Python's homepage:

>>> from ll.xist import parsers
>>> from ll.xist.ns import html
>>> node = parsers.parseurl("http://www.python.org/", utidy=True)
>>> for img in node.walknode(html.a/html.img):
...    print img.atts.src
... 
http://www.python.org/images/python-logo.gif
http://www.python.org/images/trans.gif
http://www.python.org/images/trans.gif
http://www.python.org/images/success/nasa.jpg

If you want to output both the links and the image URLs, do the following:

>>> from ll.xist import parsers, xfind
>>> from ll.xist.ns import html
>>> node = parsers.parseurl("http://www.python.org/", tidy=True)
>>> for path in node.walkpath(html.a/html.img):
...    print path[-2].attrs.href, path[-1].attrs.src
http://www.python.org/ http://www.python.org/images/python-logo.gif
http://www.python.org/#left%2dhand%2dnavigation http://www.python.org/images/trans.gif
http://www.python.org/#content%2dbody http://www.python.org/images/trans.gif
http://www.python.org/about/success/usa http://www.python.org/images/success/nasa.jpg

If you want to count the number of links on the page you can do the following:

>>> from ll import misc
>>> from ll.xist import parsers
>>> from ll.xist.ns import html
>>> node = parsers.parseurl("http://www.python.org/", tidy=True)
>>> misc.count(node.walk(html.a))
83

Replacing text

This example demonstrates how to make a copy of an XML tree with some text replacements:

from ll.xist import xsc, parsers

def p2p(node, converter):
·  if isinstance(node, xsc.Text):
·  ·  node = node.replace("Python", "Parrot")
·  ·  node = node.replace("python", "parrot")
·  return node

node = parsers.parseurl("http://www.python.org/", tidy=True)

node = node.mapped(p2p)
node.write(open("parrot_index.html", "wb"))

Converting HTML to XIST code

The class ll.xist.presenters.CodePresenter makes it possible to output an XIST tree as usable Python source code:

>>> from ll.xist import parsers, presenters
>>> node = parsers.parseurl("http://www.python.org/", tidy=True)
>>> print presenters.CodePresenter(node)
ll.xist.xsc.Frag(
·  ll.xist.ns.html.html(
·  ·  ll.xist.ns.html.head(
·  ·  ·  ll.xist.ns.html.meta(
·  ·  ·  ·  http_equiv='content-type',
·  ·  ·  ·  content='text/html; charset=utf-8'
·  ·  ·  ),
·  ·  ·  ll.xist.ns.html.title(
·  ·  ·  ·  'Python Programming Language -- Official Website'
·  ·  ·  ),
·  ·  ·  ll.xist.ns.html.meta(
·  ·  ·  ·  name='keywords',
·  ·  ·  ·  content='python programming language object oriented web free source'
·  ·  ·  ),
·  ·  ·  [... Many lines deleted ...]
·  ·  ·  ·  ·  ·  u'\n\tCopyright \xa9 1990-2007, ',
·  ·  ·  ·  ·  ·  ll.xist.ns.html.a(
·  ·  ·  ·  ·  ·  ·  'Python Software Foundation',
·  ·  ·  ·  ·  ·  ·  href='http://www.python.org/psf'
·  ·  ·  ·  ·  ·  ),
·  ·  ·  ·  ·  ·  ll.xist.ns.html.br(),
·  ·  ·  ·  ·  ·  ll.xist.ns.html.a(
·  ·  ·  ·  ·  ·  ·  'Legal Statements',
·  ·  ·  ·  ·  ·  ·  href='http://www.python.org/about/legal'
·  ·  ·  ·  ·  ·  ),
·  ·  ·  ·  ·  ·  '\n      ',
·  ·  ·  ·  ·  ·  id='footer'
·  ·  ·  ·  ·  ),
·  ·  ·  ·  ·  '\n\n\n    ',
·  ·  ·  ·  ·  id='body-main'
·  ·  ·  ·  ),
·  ·  ·  ·  '\n  ',
·  ·  ·  ·  id='content-body'
·  ·  ·  ),
·  ·  ·  '\n'
·  ·  ),
·  ·  lang='en'
·  )
)

Using converter contexts to pass information between elements

Converter contexts can be used to pass information between elements. The following example will generate HTML <h1>, ..., <h6> elements according to the nesting depth of a <section> element.

from ll.xist import xsc

class section(xsc.Element):
·  class Attrs(xsc.Element.Attrs):
·  ·  class title(xsc.TextAttr): pass

·  class Context(xsc.Element.Context):
·  ·  def __init__(self):
·  ·  ·  xsc.Element.Context.__init__(self)
·  ·  ·  self.level = 1

·  def convert(self, converter):
·  ·  context = converter[self]
·  ·  elementname = "h%d" % min(context.level, 6)
·  ·  node = xsc.Frag(
·  ·  ·  getattr(converter.target, elementname)(self.attrs.title),
·  ·  ·  self.content
·  ·  )
·  ·  context.level += 1
·  ·  node = node.convert(converter)
·  ·  context.level -= 1
·  ·  return node

with xsc.build():
·  with section(title="Python Tutorial") as document:
·  ·  with section(title="Using the Python Interpreter"):
·  ·  ·  with section(title="Invoking the Interpreter"):
·  ·  ·  ·  +section(title="Argument Passing")
·  ·  ·  ·  +section(title="Interactive Mode")
·  ·  ·  with section(title="The Interpreter and Its Environment"):
·  ·  ·  ·  +section(title="Error Handling")
·  ·  ·  ·  +section(title="Executable Python Scripts")
·  ·  ·  ·  +section(title="Source Code Encoding")
·  ·  ·  ·  +section(title="The Interactive Startup File")

print document.conv().bytes()

The output of this script will be:

<h1>Python Tutorial</h1>
<h2>Using the Python Interpreter</h2>
<h3>Invoking the Interpreter</h3>
<h4>Argument Passing</h4>
<h4>Interactive Mode</h4>
<h3>The Interpreter and Its Environment</h3>
<h4>Error Handling</h4>
<h4>Executable Python Scripts</h4>
<h4>Source Code Encoding</h4>
<h4>The Interactive Startup File</h4>