microdata

package module
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 11, 2026 License: BSD-2-Clause Imports: 13 Imported by: 6

README

Microdata

Microdata is a package to extract Microdata and JSON-LD from HTML documents.

HTML Microdata is a markup specification often used in combination with the schema collection to make it easier for search engines to identify and understand content on web pages. One of the most common schemas is the rating you see when you google for something. Other schemas are persons, places, events, products, etc.

JSON-LD is a lightweight Linked Data format. It is easy for humans to read and write. It is based on the already successful JSON format and provides a way to help JSON data interoperate at Web-scale.

Go package use

Install the package:

go get -u github.com/astappiev/microdata

Use cases:

// Pass a URL to the `ParseURL` function.
data, err := microdata.ParseURL("https://example.com/page")

// Pass a context and a URL to the `ParseURLWithContext` function.
data, err := microdata.ParseURLWithContext(ctx, "https://example.com/page")

// Pass a `io.Reader`, content-type and a base URL to the `ParseHTML` function.
data, err := microdata.ParseHTML(reader, contentType, baseURL)

// Pass a `html.Node` and a base URL to the `ParseNode` function.
data, err := microdata.ParseNode(rootNode, baseURL)

Note: The parser tolerates JSON-LD type attributes without the leading @ character.

An example program:

package main

import (
    "encoding/json"
    "fmt"

    "github.com/astappiev/microdata"
)

func main() {
    data, _ := microdata.ParseURL("https://www.allrecipes.com/recipe/84450/ukrainian-red-borscht-soup/")
    
    // iterate over metadata items:
    items := data.Items
	for _, item := range items {
		fmt.Println(item.Types)
		for key, prop := range item.Properties {
			fmt.Printf("%s: %v\n", key, prop)
		}
	}

    // print json schema
    jsonSchema, _ := json.MarshalIndent(data, "", "  ")
    fmt.Println(string(jsonSchema))
}

Command line use

Install the command line tool:

go install github.com/astappiev/microdata/cmd/microdata

Parse a URL:

microdata https://www.gog.com/game/...
{
  "items": [
    {
      "type": [
        "http://schema.org/Product"
      ],
      "properties": {
        "additionalProperty": [
          {
            "type": [
              "http://schema.org/PropertyValue"
            ],
{
...

Parse HTML from the stdin:

$ cat saved.html | microdata

Format the output with a Go template to return the "price" property:

microdata -format '{{with index .Items 0}}{{with index .Properties "offers" 0}}{{with index .Properties "price" 0 }}{{ . }}{{end}}{{end}}{{end}}' https://www.gog.com/game/...
8.99

Documentation

Overview

Package microdata is a package to extract Microdata and JSON-LD from HTML documents.

HTML Microdata is a markup specification often used in combination with the schema collection to make it easier for search engines to identify and understand content on web pages.

JSON-LD is a lightweight Linked Data format. It is easy for humans to read and write. It is based on the already successful JSON format and provides a way to help JSON data interoperate at Web-scale.

Use cases:

// Pass a URL to the ParseURL function.
data, err := microdata.ParseURL("https://example.com/page")

// Pass a context and a URL to the ParseURLWithContext function.
data, err := microdata.ParseURLWithContext(ctx, "https://example.com/page")

// Pass a io.Reader, content-type and a base URL to the ParseHTML function.
data, err := microdata.ParseHTML(reader, contentType, baseURL)

// Pass a html.Node and a base URL to the ParseNode function.
data, err := microdata.ParseNode(rootNode, baseURL)

Note: The parser tolerates JSON-LD "type" attributes without the leading "@" character, and it intentionally drops empty properties instead of recording empty strings.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Item

type Item struct {
	Types      []string    `json:"type"`
	Properties PropertyMap `json:"properties"`
	ID         string      `json:"id,omitempty"`
}

Item represents a single microdata item.

func NewItem

func NewItem() *Item

func (*Item) CountPaths added in v1.0.0

func (i *Item) CountPaths(prefix string, paths map[string]int)

CountPaths recursively counts the occurrences of item paths, storing the results in the provided paths map.

func (*Item) GetNested added in v1.0.0

func (i *Item) GetNested(keys ...string) (data Microdata, ok bool)

GetNested returns the extracted microdata for the properties of the first key that has at least one value.

func (*Item) GetNestedItem added in v1.0.0

func (i *Item) GetNestedItem(keys ...string) (val *Item, ok bool)

GetNestedItem returns the first item from the properties of the first key that has at least one value.

func (*Item) GetProperties added in v1.0.0

func (i *Item) GetProperties(keys ...string) (arr []any, ok bool)

GetProperties returns the values of the first key that has at least one value.

func (*Item) GetProperty added in v1.0.0

func (i *Item) GetProperty(keys ...string) (val any, ok bool)

GetProperty returns the first value of the first key that has at least one value.

func (*Item) IsOfSchemaType added in v1.0.1

func (i *Item) IsOfSchemaType(itemType string) bool

IsOfSchemaType returns whether the item is of the given type within the schema.org context.

func (*Item) IsOfType added in v1.0.0

func (i *Item) IsOfType(itemType ...string) bool

IsOfType returns whether the item is of the given type.

type Microdata

type Microdata struct {
	Items []*Item `json:"items"`
}

Microdata represents the extracted microdata from a HTML document.

func ParseHTML

func ParseHTML(r io.Reader, contentType, urlStr string) (*Microdata, error)

ParseHTML parses the HTML document available in the given reader and returns the microdata. The given url is used to resolve the URLs in the attributes. The given contentType is used to convert the content of r to UTF-8. When the given contentType is equal to "", the content type will be detected using `http.DetectContentType`.

func ParseNode added in v1.0.0

func ParseNode(root *html.Node, urlStr string) (*Microdata, error)

ParseNode parses the root Node and returns the microdata.

func ParseURL

func ParseURL(urlStr string) (*Microdata, error)

ParseURL parses the HTML document available at the given URL and returns the microdata.

func ParseURLWithClient added in v1.2.0

func ParseURLWithClient(ctx context.Context, client *http.Client, urlStr string) (*Microdata, error)

ParseURLWithClient parses the HTML document available at the given URL using the provided context and client.

func ParseURLWithContext added in v1.1.0

func ParseURLWithContext(ctx context.Context, urlStr string) (*Microdata, error)

ParseURLWithContext parses the HTML document available at the given URL using the provided context and returns the microdata. It uses http.DefaultClient to fetch the document.

func (*Microdata) GetFirstOfSchemaType added in v1.0.1

func (m *Microdata) GetFirstOfSchemaType(itemType string) *Item

GetFirstOfSchemaType returns the first item of the given type with a possible https://schema.org/ context.

func (*Microdata) GetFirstOfType added in v1.0.0

func (m *Microdata) GetFirstOfType(itemType ...string) *Item

GetFirstOfType returns the first item of the given type.

type PropertyMap

type PropertyMap map[string]ValueList

PropertyMap represents a map of property names to their corresponding value lists.

type ValueList

type ValueList []any

ValueList represents a list of values for a property.

Directories

Path Synopsis
cmd
microdata command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL