Hoppa till innehållet

Strukturerad data

fakta om en sida, skrivna för maskiner

Vad det är

Ett företags kontaktsida säger i en mening var kontoret ligger. Strukturerad data säger samma sak en gång till, som en PostalAddress med gatuadress, postnummer och land, så att ett program som läser sidan slipper gissa vilket ord som är orten. Det är bruket att upprepa det som en sida säger i löptext som typade påståenden i ett ordförråd som utgivare och läsande program är överens om, så att sökmotorer och annan mjukvara kan läsa fakta utan att tolka layouten. Ordet behandlas som en mängd och inte som något räknebart, och i bestämd form heter det den strukturerade datan.

Ordförrådet är oftast schema.org, som enligt Googles dokumentation är det ordförråd som merparten av den strukturerade datan för Googles sökning bygger på. Google, Microsoft, Yahoo och Yandex grundade det, och sedan april 2015 är en gemenskapsgrupp (community group) inom W3C dess huvudsakliga forum. Det definierar typer, som Organization, Person, Service, Review eller DefinedTerm, och de egenskaper som varje typ kan bära, som name, address, author eller price.

Påståendena kan skrivas i tre syntaxer. Microdata och RDFa lägger attribut direkt på de synliga HTML-elementen. JSON-LD håller påståendena åtskilda, som ett block JSON i ett script-element av typen application/ld+json, och är i version 1.1 en W3C-rekommendation, publicerad den 16 juli 2020. Google godtar alla tre som likvärdiga och rekommenderar JSON-LD som den som är lättast att underhålla i stor skala.

<script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "Organization",
        "@id": "https://example.com/#organization",
        "name": "Example Ltd",
        "url": "https://example.com/"
    }
</script>

Den viktigaste raden i blocket är @id. JSON-LD använder den för att identifiera en nod, och en nod utan identifierare är en så kallad blank node, som ingenting utanför det egna blocket kan peka på. Med en identifierare kan vilket annat block som helst, på vilken annan sida som helst, skriva "publisher": {"@id": "https://example.com/#organization"}, vilket specifikationen kallar en nodreferens (node reference): en pekare till något som beskrivs på annat håll, i stället för en ny beskrivning av det. Det är identifierarna som gör en spridd samling block till en enda graf.

Närmaste grannterm är metadata. Titeln, beskrivningen och Open Graph-taggarna i sidans head beskriver sidan som dokument, medan strukturerad data beskriver det som sidan handlar om: företaget bakom den, personen som skrev den, tjänsten den erbjuder eller ordet den definierar.

Varför det spelar roll

Beslutet gäller hur mycket som ska sägas, och det ärliga svaret är oftast mindre än ordförrådet tillåter, men komplett. Ingenting i syntaxen hindrar en utgivare från att fylla i varje egenskap som schema.org erbjuder. Googles egna riktlinjer pekar åt andra hållet: ange färre rekommenderade egenskaper, kompletta och korrekta, hellre än alla tänkbara med ofullständiga eller felaktiga uppgifter, och märk inte upp något som en läsare inte kan se på sidan, inte ens när det är sant.

Skälet är att varje uppmärkt faktum är en andra kopia av något som sidan redan säger, och en andra kopia kan glida isär från originalet. Ett pris som ändrats i den synliga tabellen men glömts i JSON-blocket, ett betyg som bara maskiner ser, en adress som skrivits lite olika på varje sida: var och en får sidan att säga en sak till människor och en annan till program. Kostnaden för strukturerad data ligger mindre i att skriva den än i att hålla den sann, så de användbara frågorna är vilka påståenden sidan kan stå för och om de kommer från samma källa som den synliga texten.

Vinsten är läsbarhet för maskiner. En sökmotor eller en agent som kan foga samman hundra omnämnanden till ett enda företag vet mer än en som läser hundra namn utan samband. Sidor som följer riktlinjerna kan bli berättigade till utökade resultat (rich results), sökträffar med extra detaljer, men att vara berättigad garanterar inga sådana. Det som förändras är hur väl en maskin förstår vad sidan handlar om.

Så ser det ut i praktiken

Webbplatsens kolofon lovar att bara märka upp det som är sant och synligt på sidan, och historiken bakom webbplatsens strukturerade data visar varför den meningen behövde skrivas ned.

Före omarbetningen beskrev 963 block företaget 1 671 gånger, utan en enda stabil identifierare, så ingen som läste datan hade grund för att behandla organisationen på en sida som organisationen på en annan. Grafen vilar nu på tre identifierare som skapas utifrån webbplatsens ursprung, en för organisationen, en för webbplatsen och en för grundaren, och varje annat block refererar till dem med @id i stället för att beskriva dem igen. Identifierarna är desamma på alla språk: en kommentar i mallen förklarar att en separat dansk identifierare skulle deklarera en andra organisation med samma CVR-nummer. Sexton typer används, och listor nämner sina poster enbart med URL, eftersom det skulle ha gjort den komprimerade indexsidan för portföljen 52 % tyngre att skriva ut alla 107 poster.

Flera fakta läses från samma källa som den synliga sidan. Tjänstepriserna kommer från samma datafil som priserna på skärmen, så en maskin och en läsare får samma pris. Perioden som ett arbete omfattar kommer från den partial som skriver meningen om det. Brödsmulorna följer den synliga stigen, och positionerna i listor följer ordningen på skärmen, aldrig en rangordning som bara publiceras för maskiner. Sidans egen nod använder samma adress som sidan anger som kanonisk URL, så att märkningen och sidans head gör ett och samma påstående.

Det som lämnas bort är lika avsiktligt som det som sägs. Företagets egna beskrivningar av sitt arbete märks inte upp som recensioner, eftersom det skulle hitta på en författare till dess egna ord. Rekommendationer från namngivna personer märks upp, men utan betyg, eftersom ingen har gett något. Varje sida i ordlistan, den här inräknad, bär en DefinedTerm vars beskrivning är den enradiga förklaringen som visas i listan, så att definitionen en maskin läser är densamma som en läsare ser.

En kontroll över den byggda webbplatsen säkerställer att varje block går att tolka, att varje identifierare går att slå upp och att varje URL som grafen nämner faktiskt byggdes, så en graf som pekar på en sida som inte finns stoppas i kvalitetsgrinden. Samma kolofon listar Schema Markup Validator för att läsa datan och Googles Rich Results Test för att se vad en sökmotor gör med den.

Var det går fel

Sidan visas som en vanlig sökträff trots att varje validator godkänner den. Märkningen är giltig JSON-LD och använder riktiga typer från schema.org, men sidan fortsätter att dyka upp utan extra detaljer. Datan beskriver sådant som en läsare inte kan se, som ett betyg som ingen har gett, frågor som är dolda på sidan eller ett pris som skiljer sig från det på skärmen, och Google varnar för att märkning som bryter mot riktlinjerna kan göra att en sida inte är berättigad till utökade resultat, hur ren syntaxen än är. Märk bara upp det som sidan visar, och generera båda från en källa så att de inte kan glida isär.

Hundratals block beskriver ett och samma företag, och inget fogar samman dem. Varje sida upprepar organisationens namn, logotyp och adress, ibland med små skillnader, och att rätta en detalj innebär att leta upp alla. Noderna är anonyma, eller så skapar varje sida och varje språk sin egen identifierare för samma sak. Ge varje verklig sak ett @id byggt av en stabil URL med ett fragment, beskriv den en gång och referera till den överallt annars.

En ändring i en mall förstör märkningen på alla sidor på en gång. Ett citattecken på fel ställe, ett avslutande kommatecken eller ett tomt värde gör varje block ogiltigt, och ingen som läser datan kan använda något av den. Googles guide varnar för att mallar kan förstöra märkningen efter en driftsättning. JSON-blocket sattes ihop som text, med värden inklistrade mellan klammerparenteser, så ett fält som saknas lämnar en tom sträng eller en trasig struktur. Bygg påståendet som en datastruktur och serialisera det, som den här webbplatsens mallar gör med Hugos jsonify, utelämna egenskaper som saknar värde i stället för att skriva ut dem tomma, och tolka varje block i det byggda resultatet.

Grafen nämner sidor som inte finns. URL:erna i märkningen leder till en 404-sida, en testmiljö eller en speglad kopia. Adresserna skrevs för hand eller byggdes efter en annan regel än länkarna och den kanoniska adressen. Härled varje URL i märkningen från samma funktion som tar fram sidans kanoniska adress, och kontrollera att var och en byggdes.

Läs mer

Ordlista