{"id":35,"date":"2006-06-06T20:30:24","date_gmt":"2006-06-07T03:30:24","guid":{"rendered":"https:\/\/dubinko.info\/blog\/2006\/06\/06\/microformat-validation-with-python-and-xpath\/"},"modified":"2006-06-06T20:32:36","modified_gmt":"2006-06-07T03:32:36","slug":"microformat-validation-with-python-and-xpath","status":"publish","type":"post","link":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/","title":{"rendered":"Microformat validation with Python and XPath"},"content":{"rendered":"<p>Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. <a href=\"http:\/\/xformsinstitute.com\/validator\/\">I should know<\/a>. I&#8217;ve recently figured out a few things that make it even better.<\/p>\n<p><strong>Line numbers in error messages.<\/strong> Libxml2 docs aren&#8217;t exactly forthcoming in this area. It&#8217;s pretty easy to register an error callback, but maddeningly it doesn&#8217;t include line numbers (except when piping errors directly to stdout, as several examples show). The C APIs have a whole notion of Structured Error Handling, which doesn&#8217;t seem to come across to the Python bindings. Getting the line number of a node is also straightforward, but I couldn&#8217;t figure out how to get the line of an <em>error<\/em>. Fortunately, the answer is simple:<\/p>\n<blockquote>\n<pre>e = libxml2.lastError()\r\nprint e.line()  # in contrast to node.lineNo()...<\/pre>\n<\/blockquote>\n<p><strong>Checking for a class.<\/strong> Another common task in validating microformats is checking whether an element has a certain class applied to it. Since the class attribute takes a space-separated list of class values, this is harder than string search&#8211;you really need a tokenizer. Again, Python Libxml2 comes through. It&#8217;s reasonably simple to write an XPath extension function in Python:<\/p>\n<blockquote>\n<pre>def hasClass(ctx, content, cssclass):\r\nrc = \"\"\r\nif (isinstance(content, str):\r\ntokens = content.split()\r\nfor token in tokens:\r\nif token==cssclass: rc = \"1\"\r\nreturn rc\r\n\r\n# register the function on an XPath context (ctx)\r\nctx.registerXPathFunction(\"hasClass\", \"http:\/\/some.uri\", hasClass)<\/pre>\n<\/blockquote>\n<p>(WordPress keeps eating the indentation on the above&#8230;you&#8217;ll figure it out.) Props to Kimbro Staken who did all the initial <a title=\"libxslt Extension Functions in Python\" href=\"http:\/\/www.xmldatabases.org\/movabletype\/archives\/000291.html\">hard<\/a> <a title=\"Writing libxslt extension modules in Python\" href=\"http:\/\/www.xmldatabases.org\/WK\/blog\/1274?t=item\">work<\/a>. Comments? -m<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I&#8217;ve recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren&#8217;t exactly forthcoming in this area. It&#8217;s pretty easy to register an error callback, but maddeningly it doesn&#8217;t include&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[5],"tags":[],"class_list":["post-35","post","type-post","status-publish","format-standard","hentry","category-microformats"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I&#039;ve recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren&#039;t exactly forthcoming in this area. It&#039;s pretty easy to register an error callback, but maddeningly it doesn&#039;t include\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"mdubinko\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"MicahLogic Queryopticon | Yields undecidable when preceded by its quotation\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Microformat validation with Python and XPath | MicahLogic Queryopticon\" \/>\n\t\t<meta property=\"og:description\" content=\"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I&#039;ve recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren&#039;t exactly forthcoming in this area. It&#039;s pretty easy to register an error callback, but maddeningly it doesn&#039;t include\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2006-06-07T03:30:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2006-06-07T03:32:36+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Microformat validation with Python and XPath | MicahLogic Queryopticon\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I&#039;ve recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren&#039;t exactly forthcoming in this area. It&#039;s pretty easy to register an error callback, but maddeningly it doesn&#039;t include\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#article\",\"name\":\"Microformat validation with Python and XPath | MicahLogic Queryopticon\",\"headline\":\"Microformat validation with Python and XPath\",\"author\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\"},\"datePublished\":\"2006-06-06T20:30:24-07:00\",\"dateModified\":\"2006-06-06T20:32:36-07:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#webpage\"},\"articleSection\":\"microformats\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/#listItem\",\"name\":\"standards\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/#listItem\",\"position\":2,\"name\":\"standards\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/microformats\\\/#listItem\",\"name\":\"microformats\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/microformats\\\/#listItem\",\"position\":3,\"name\":\"microformats\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/microformats\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#listItem\",\"name\":\"Microformat validation with Python and XPath\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/#listItem\",\"name\":\"standards\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#listItem\",\"position\":4,\"name\":\"Microformat validation with Python and XPath\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/standards\\\/microformats\\\/#listItem\",\"name\":\"microformats\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\",\"name\":\"MicahLogic Queryopticon\",\"description\":\"Yields undecidable when preceded by its quotation\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"mdubinko\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c1160c0ab9ce581a55013f96fd61356e166ffc9a00666a5062bc8121922fcdcd?s=96&d=retro&r=g\",\"width\":96,\"height\":96,\"caption\":\"mdubinko\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#webpage\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/\",\"name\":\"Microformat validation with Python and XPath | MicahLogic Queryopticon\",\"description\":\"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I've recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren't exactly forthcoming in this area. It's pretty easy to register an error callback, but maddeningly it doesn't include\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2006\\\/06\\\/microformat-validation-with-python-and-xpath\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2006-06-06T20:30:24-07:00\",\"dateModified\":\"2006-06-06T20:32:36-07:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/\",\"name\":\"MicahLogic Queryopticon\",\"description\":\"Yields undecidable when preceded by its quotation\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Microformat validation with Python and XPath | MicahLogic Queryopticon","description":"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I've recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren't exactly forthcoming in this area. It's pretty easy to register an error callback, but maddeningly it doesn't include","canonical_url":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#article","name":"Microformat validation with Python and XPath | MicahLogic Queryopticon","headline":"Microformat validation with Python and XPath","author":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/dubinko.info\/blog\/#organization"},"datePublished":"2006-06-06T20:30:24-07:00","dateModified":"2006-06-06T20:32:36-07:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#webpage"},"isPartOf":{"@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#webpage"},"articleSection":"microformats"},{"@type":"BreadcrumbList","@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog#listItem","position":1,"name":"Home","item":"https:\/\/dubinko.info\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/standards\/#listItem","name":"standards"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/standards\/#listItem","position":2,"name":"standards","item":"https:\/\/dubinko.info\/blog\/tags\/standards\/","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/standards\/microformats\/#listItem","name":"microformats"},"previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/standards\/microformats\/#listItem","position":3,"name":"microformats","item":"https:\/\/dubinko.info\/blog\/tags\/standards\/microformats\/","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#listItem","name":"Microformat validation with Python and XPath"},"previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/standards\/#listItem","name":"standards"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#listItem","position":4,"name":"Microformat validation with Python and XPath","previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/standards\/microformats\/#listItem","name":"microformats"}}]},{"@type":"Organization","@id":"https:\/\/dubinko.info\/blog\/#organization","name":"MicahLogic Queryopticon","description":"Yields undecidable when preceded by its quotation","url":"https:\/\/dubinko.info\/blog\/"},{"@type":"Person","@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author","url":"https:\/\/dubinko.info\/blog\/author\/admin\/","name":"mdubinko","image":{"@type":"ImageObject","@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/c1160c0ab9ce581a55013f96fd61356e166ffc9a00666a5062bc8121922fcdcd?s=96&d=retro&r=g","width":96,"height":96,"caption":"mdubinko"}},{"@type":"WebPage","@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#webpage","url":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/","name":"Microformat validation with Python and XPath | MicahLogic Queryopticon","description":"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I've recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren't exactly forthcoming in this area. It's pretty easy to register an error callback, but maddeningly it doesn't include","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/dubinko.info\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/#breadcrumblist"},"author":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"datePublished":"2006-06-06T20:30:24-07:00","dateModified":"2006-06-06T20:32:36-07:00"},{"@type":"WebSite","@id":"https:\/\/dubinko.info\/blog\/#website","url":"https:\/\/dubinko.info\/blog\/","name":"MicahLogic Queryopticon","description":"Yields undecidable when preceded by its quotation","inLanguage":"en-US","publisher":{"@id":"https:\/\/dubinko.info\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"MicahLogic Queryopticon | Yields undecidable when preceded by its quotation","og:type":"article","og:title":"Microformat validation with Python and XPath | MicahLogic Queryopticon","og:description":"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I've recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren't exactly forthcoming in this area. It's pretty easy to register an error callback, but maddeningly it doesn't include","og:url":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/","article:published_time":"2006-06-07T03:30:24+00:00","article:modified_time":"2006-06-07T03:32:36+00:00","twitter:card":"summary","twitter:title":"Microformat validation with Python and XPath | MicahLogic Queryopticon","twitter:description":"Python+XPath is a surprisingly powerful combination for doing all kinds of arbitrary validation tasks. I should know. I've recently figured out a few things that make it even better. Line numbers in error messages. Libxml2 docs aren't exactly forthcoming in this area. It's pretty easy to register an error callback, but maddeningly it doesn't include"},"aioseo_meta_data":{"post_id":"35","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-04 08:07:40","updated":"2025-12-10 02:11:57","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\/tags\/standards\/\" title=\"standards\">standards<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\/tags\/standards\/microformats\/\" title=\"microformats\">microformats<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tMicroformat validation with Python and XPath\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/dubinko.info\/blog"},{"label":"standards","link":"https:\/\/dubinko.info\/blog\/tags\/standards\/"},{"label":"microformats","link":"https:\/\/dubinko.info\/blog\/tags\/standards\/microformats\/"},{"label":"Microformat validation with Python and XPath","link":"https:\/\/dubinko.info\/blog\/2006\/06\/microformat-validation-with-python-and-xpath\/"}],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8eo8l-z","jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/35","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/comments?post=35"}],"version-history":[{"count":0,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/35\/revisions"}],"wp:attachment":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/media?parent=35"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/categories?post=35"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/tags?post=35"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}