############################
Structured-data extraction
############################
:meth:`~turbohtml.Document.structured_data` answers the scraping question ``extruct`` and ``metadata_parser`` exist for:
what machine-readable metadata does this page embed? It pulls JSON-LD, Microdata, OpenGraph/Twitter card metadata, RDFa,
and Dublin Core in one walk, with the per-format helpers :meth:`~turbohtml.Document.json_ld`,
:meth:`~turbohtml.Document.opengraph`, :meth:`~turbohtml.Document.microdata`, :meth:`~turbohtml.Document.rdfa`, and
:meth:`~turbohtml.Document.dublin_core` beside it. The combined result is a frozen :class:`~turbohtml.StructuredData`
record with a stable six-field shape -- ``json_ld``, ``microdata``, ``opengraph``, ``rdfa``, ``dublin_core``, plus
``microformats`` reserved for a later phase -- so code that reads it does not break when that format lands. The records
hold no reference back into the tree, so they outlive the document they came from.
*********************
Where the work runs
*********************
The division of labor is the same one the rest of the read path follows: the *locating* runs in C and the only genuinely
Python step stays in Python. A pure-C pass under the per-tree critical section walks the document once per format,
gathering the ``itemscope``/``itemprop``/``itemtype`` structure into nested :class:`~turbohtml.MicrodataItem` records
and the OpenGraph and Twitter ```` pairs into a flat mapping, all holding no reference back into the tree. JSON-LD
is the one exception: the C walk gathers the verbatim text of each ``