Skip to main content

A zero-depencency, extendable HTML5 parser.

Project description

Dompa

Coverage

A zero-dependency HTML5 document parser. It takes an input of an HTML string, parses it into a node tree, and provides an API for querying and manipulating said node tree.

Install

pip install dompa

Requires Python 3.10 or higher.

Usage

The most basic usage looks like this:

from dompa import Dompa
from dompa.actions import ToHtml

dom = Dompa("<div>Hello, World</div>")

# Get the tree of nodes
nodes = dom.get_nodes()

# Turn the node tree into HTML
html = dom.action(ToHtml)

DOM manipulation

You can run queries on the node tree to get or manipulate node(s).

query

You can find nodes with the query method which takes a Callable that gets Node passed to it and that has to return a boolean true or false, like so:

from dompa import Dompa

dom = Dompa("<h1>Site Title</h1><ul><li>...</li><li>...</li></ul>")
list_items = dom.query(lambda n: n.name == "li")

All nodes returned with query are deep copies, so mutating them has no effect on Dompa's state.

traverse

The traverse method is very similar to the query method, but instead of returning deep copies of data it returns a direct reference to data instead, meaning it is ideal for updating the node tree inside of Dompa. It takes a Callable that gets a Node passed to it, and has to return the updated node, like so:

from typing import Optional
from dompa import Dompa
from dompa.nodes import Node, TextNode

dom = Dompa("<h1>Site Title</h1><ul><li>...</li><li>...</li></ul>")


def update_title(node: Node) -> Optional[Node]:
    if node.name == "h1":
        node.children = [TextNode(value="New Title")]

    return node


dom.traverse(update_title)

If you wish to remove a node then return None instead of the node. If you wish to replace a single node with multiple nodes, use FragmentNode.

Types of nodes

There are three types of nodes that you can use in Dompa to manipulate the node tree.

Node

The most common node is just Node. You should use this if you want the node to potentially have any children inside of it.

from dompa.nodes import Node

Node(name="name-goes-here", attributes={}, children=[])

Would render:

<name-goes-here></name-goes-here>

VoidNode

A void node (or Void Element according to the HTML standard) is self-closing, meaning you would not have any children in it.

from dompa.nodes import VoidNode

VoidNode(name="name-goes-here", attributes={})

Would render:

<name-goes-here>

You would use this to create things like img, input, br and so forth, but of course you can also create custom elements. Dompa does not enforce the use of any known names.

TextNode

A text node is just for rendering text. It has no tag of its own, it cannot have any attributes and no children.

from dompa.nodes import TextNode

TextNode(value="Hello, World!")

Would render:

Hello, World!

FragmentNode

A fragment node is a node whose children will replace itself. It is sort of a transient node in a sense that it doesn't really exist. You can use it to replace a single node with multiple nodes on the same level inside of the traverse method.

from dompa.nodes import TextNode, FragmentNode, Node

FragmentNode(children=[
    Node(name="h2", children=[TextNode(value="Hello, World!")]),
    Node(name="p", children=[TextNode(value="Some content ...")])
])

Would render:

<h2>Hello, World!</h2>
<p>Some content ...</p>

Actions

Both Dompa and its nodes have actions - a way to extend built-in functionality to do additional things, like for example converting the node tree into some desired result or perhaps manipulating inner state. Use your imagination.

Dompa Actions

You can create a Dompa action by extending the abstract class dompa.DompaAction with your action class, like for example:

from dompa import Dompa, DompaAction

class MyAction(DompaAction):
    def __init__(self, instance: Dompa):
        self.instance = instance

    def make(self):
        pass

Basically, an action gets an instance of the Dompa class, and has a make method that does something with it.

ToHtml

To convert the Dompa node tree into an HTML string, you can make use of the ToHtml action.

from dompa import Dompa
from dompa.actions import ToHtml

template = Dompa("<h1>Hello World</h1>")
html = template.action(ToHtml)

Node Actions

Node actions are basically identical to Dompa actions, except that they are in a different namespace and, naturally, only work on the Node class (and its child classes). You can create a Node action by extending the abstract class dompa.nodes.NodeAction with your action class, like so:

from dompa.nodes import Node, NodeAction

class MyAction(NodeAction):
    def __init__(self, instance: Node):
        self.instance = instance

    def make(self):
        pass

Just like with the DompaAction, a NodeAction also gets an instance of the Node class, and has a make method that does something with it.

ToHtml

To convert a Node into an HTML string, you can make use of the ToHtml action.

from dompa import Dompa
from dompa.nodes.actions import ToHtml

template = Dompa("<h1>Hello World</h1>")
h1_node = template.query(lambda x: x.name == "h1")[0]
html = h1_node.action(ToHtml)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dompa-0.8.0.tar.gz (11.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dompa-0.8.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file dompa-0.8.0.tar.gz.

File metadata

  • Download URL: dompa-0.8.0.tar.gz
  • Upload date:
  • Size: 11.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.13.1

File hashes

Hashes for dompa-0.8.0.tar.gz
Algorithm Hash digest
SHA256 64f0b687449a3d9df0d7dc3c889807e7dcd301232b0cf7817a788e62204b1d69
MD5 b0a91f583ef03d51990d33e69452a4ac
BLAKE2b-256 2f81d090aad546f1bc2b9a0dc73a41e6805a2d1a75ddb093ed45b423ceaa2d95

See more details on using hashes here.

File details

Details for the file dompa-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: dompa-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.13.1

File hashes

Hashes for dompa-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 837741a2682073604f36e0ca855a31add76694558a6552b98e46e9c4dbf4beb6
MD5 1ed6c5b9fbe73c68ab147ec15e65dd4e
BLAKE2b-256 e3e5504d34681f0d899756df5d4c5935c7f0684eb8df2840ed4b04bc8c508b84

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page