diff --git a/editorjs/blocks.py b/editorjs/blocks.py
index 9627a82..bc93cee 100644
--- a/editorjs/blocks.py
+++ b/editorjs/blocks.py
@@ -210,14 +210,30 @@ class ParagraphBlock(EditorJSBlock):
 
                 if child.get("value", "").endswith("/>"):
                     # self-closing
-                    result.append(EditorJSCustom.to_json(node))
+                    result.append(EditorJSCustom.to_json({"children": [child]}))
                 else:
-                    # <editorjs>something</editorjs> = 3 children
-                    result.extend(
-                        EditorJSCustom.to_json({"children": nodes[idx : idx + 2]})
-                    )
-
-                    skip = 2
+                    # <editorjs>...</editorjs> may include nested HTML; find the closing tag
+                    end_idx = None
+                    for j, next_child in enumerate(nodes[idx + 1 :], start=idx + 1):
+                        if next_child.get("type") == "html" and next_child.get(
+                            "value", ""
+                        ).strip() == "</editorjs>":
+                            end_idx = j
+                            break
+
+                    if end_idx is None:
+                        # fallback to previous behavior if tag is malformed
+                        result.extend(
+                            EditorJSCustom.to_json({"children": nodes[idx : idx + 2]})
+                        )
+                        skip = 2
+                    else:
+                        result.extend(
+                            EditorJSCustom.to_json(
+                                {"children": nodes[idx : end_idx + 1]}
+                            )
+                        )
+                        skip = end_idx - idx
 
                 continue
 
