============= 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/"), · · · · "." · · · ) · · ) · ) ) 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(".") ============= Printing HTML ============= When you have an XIST tree you can print it with the ``string`` method 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.string(encoding="us-ascii")) When you want to save this into a file, use the ``bytes`` method instead of ``string``: with open("example.xml", "wb") as f: · f.write(node.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().string(encoding="us-ascii")) ============ Parsing HTML ============ Parsing HTML is done like this: from ll.xist import parse from ll.xist.ns import html node = parse.tree( · parse.URL("http://www.python.org/"), · parse.Tidy(), · parse.NS(html), · parse.Node() ) ========================== 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 parse`` ``>>> ````from ll.xist.ns import html`` ``>>> ````node = parse.tree(`` ``... ```` parse.URL("http://www.python.org/"),`` ``... ```` parse.Expat(ns=True),`` ``... ```` parse.Node()`` ``... ````)`` ``>>> ````for img in node.walknodes(html.a/html.img):`` ``... ```` print(img.attrs.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 parse, xfind`` ``>>> ````from ll.xist.ns import html`` ``>>> ````node = parse.tree(`` ``... ```` parse.URL("http://www.python.org/"),`` ``... ```` parse.Expat(ns=True),`` ``... ```` parse.Node()`` ``... ````)`` ``>>> ````for path in node.walkpaths(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 parse`` ``>>> ````from ll.xist.ns import html`` ``>>> ````node = parse.tree(`` ``... ```` parse.URL("http://www.python.org/"),`` ``... ```` parse.Expat(ns=True),`` ``... ```` parse.Node()`` ``... ````)`` ``>>> ````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, parse def p2p(node, converter): · if isinstance(node, xsc.Text): · · node = node.replace("Python", "Parrot") · · node = node.replace("python", "parrot") · return node node = parse.tree( · parse.URL("http://www.python.org/"), · parse.Expat(ns=True), · parse.Node() ) node = node.mapped(p2p) node.write(open("parrot_index.html", "wb")) ============================ Converting HTML to XIST code ============================ The class ``ll.xist.present.CodePresenter`` makes it possible to output an XIST tree as usable Python source code: ``>>>`` ``from ll.xist import parse, present`` ``>>> ````node = parse.tree(`` ``... ```` parse.URL("http://www.python.org/"),`` ``... ```` parse.Expat(ns=True),`` ``... ```` parse.Node()`` ``... ````)`` ``>>>`` ``print(present.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 ``