torsdag 25. april 2013

Instapaper for eksperter: Konfigurering av tekstmotoren

Instapaper logo

Jeg har allerede fortalt deg hvordan du kan bedre opplevelsen av å lese lange tekster på nett med Instapaper, og hvordan du enkelt (etter et engangoppsett) kan overføre leselisten din til Kindle med best mulig sluttresultat. Det er helt greit om du velger å gi deg nå – dette er mer for spesielt interesserte: Jeg skal fortelle deg hvordan du kan sørge for at Instapaper plukker opp riktig brødtekst, tittel, forfatter osv. på dine favorittsider.

Her er det dessverre ingen vei utenom: Du må ha grunnleggende kjennskap til HTML-kode. Dette innebærer å kjenne til hva tags er (for eksempel <body>, <div>, <p>, <span>), samt deres attributter (for eksempel class, id, href, src).

Er du klar? Da setter vi i gang.

XPath

Jobben gjøres på instapaper.com/bodytext. Her skriver du inn adressen til en artikkel (ikke til hovedsiden), og trykker på Configure. Sidetittelen (til hovedsiden) skal komme opp automatisk, rett den hvis den er feil. Tekstboksen er mest sannsynlig tom (hvis ikke er det noen som allerede har konfigurert siden, men du må gjerne gjøre hensiktsmessige endringer). Trykk gjerne allerede nå på Preview for å se hva du har å rette på.

Til høyre for tekstboksen står litt om hva du skal gjøre. For å fortelle Instapaper hva tittelen er, skal du i tekstboksen skrive title: [XPath], hvor [XPath] er et XPath-uttrykk. XPath er et relativt enkelt språk for å finne objekter (f.eks. HTML-tags, generelt kalles dette nodes i denne sammenhengen) i XML-dokumenter (slik som det meste av HTML). Et XPath-uttrykk kan returnere én enkelt node dersom bare én passer med det du skriver, eller et helt sett med noder (nodeset) dersom flere treff passer. Da tror jeg generelt Instapaper vil bruke den første av treffene i nodesettet.

Det finnes flere korte og greie introduksjoner til XPath, slik som denne fra W3Schools og denne fra O'Reilly. Jeg skal ta det helt grunnleggende du trenger her.

XPath er litt som en utvidet versjon av å skrive inn sti- og filnavn til filer på PC-en din, eller i adressefeltet på nettleseren. Hvis du vil begynne å velge noe helt fra «toppen av», begynner du med én skråstrek. I HTML vil <html> alltid være toppnivå-taggen, så om du skal finne (alle) div-tags som befinner seg i (alle) body-tags som befinner seg i (alle) html-tags, så skriver du /html/body/div.

Det er imidlertid litt kronglete å alltid skrive seg nedover fra toppen, så du kan i stedet begynne med to skråstreker: Skriver du //div vil dette matche alle div-tags i hele dokumentet. (Og siden div-tags kun finnes i den ene body-taggen, som kun finnes i den ene html-taggen, så vil dette gi samme resultat som over.)

Vi trenger én ting til for å kunne velge spesifikke elementer fra en side. Hvis all artikkelteksten for eksempel befinner seg i en div-tag med id-en 'body-text', så blir XPath-uttrykket for å finne denne //div[@id='body-text']. Om tittelen finnes i en h1-tag med class-en 'article_title' blir XPath-uttrykket //h1[@class='article_title']. Merk at disse uttrykkene vil matche alle tags som passer, og Instapaper vil bruke den første av dem. Ofte er det imidlertid bare én som matcher.

For å bruke dette i Instapaper-sammenheng følger du altså instruksene til høyre for tekstboksen. For å definere tittelen skriver du for eksempel title: //h1[@class='article_title']. Hopp til ny linje for å legge til flere uttrykk. Instapaper har også noen utvidete muligheter som er veldig praktiske. En endring som ofte er veldig lur å gjøre, er å fjerne sitatbokser (med sitater fra artikkelen) som ofte er spredd ut gjennom artikkelteksten. Når disse plukkes opp av Instapaper vil de oftest dukke opp som en del av teksten, og du vil få det som ser ut som mindre avsnitt som er tatt helt ut av sammenhengen. For å fjerne dette kan man for eksempel bruke Instapapers strip_id_or_class:. Denne etterfølges av en tekststreng som angir en class eller id du vil fjerne helt. Hvis alle slike sitatbokser for eksempel er en span-tag med classen 'pullquote', så skriver du strip_id_or_class: pullquote. Og vips, så er alle elementer som har den classen borte vekk. Alternativt kan du bruke Instapapers strip:, hvor du må skrive et fullt XPath-uttrykk etterpå, som i denne sammenhengen blir //span[@class='pullquote'].

Om du får problemer med XPath, sjekk slurvefeil som å glemme skråstreker på begynnelsen, krøllalfa foran attributtnavn og så videre. Jeg har bommet på dette flere ganger selv.

To fine hjelpeverktøy

Jeg tror jeg lar det ligge der. Man kan gjøre veldig mye mer utav det, men alt kan man lese seg til på nett. Det er imidlertid nyttig å ha en enkel måte for å finne de HTML-taggene du er ute etter, slik at du vet hva du skal skrive i XPath. Jeg anbefaler på det varmeste Firebug for Firefox. Chrome trenger ingen tillegg, og fungerer på samme måte: Trykk F12 i nettleseren. Da får du opp koden, samt en knapp (musepeker over firkant i Firebug, forstørrelsesglass i Chrome) du kan trykke på, og deretter kan du trykke direkte på f.eks. overskriften til artikkelen for å hoppe til denne i kodevisningen.

Et annet verktøy som er ekstremt nyttig når man lærer seg XPath, er å kunne sjekke om du faktisk skriver det riktig (eller om det er Instapaper som gjør feil). Jeg anbefaler FirePath for Firefox (Chrome-brukere må pent finne noe tilsvarende selv), som integrerer seg fint i Firebug. Alternativt kan du bruke Xpath Checker, som gjør at du kan høyreklikke i en side, velge View XPath, og skrive inn XPath-uttrykkene øverst for å se hva som kommer fram. Dette kan hjelpe deg godt på vei – jeg skjønte slett ikke hvorfor tittelen på en side jeg jobbet på aldri kom fram i Instapaper, og fant med dette verktøyet ut at tittelen ikke var første treff, som i stedet var tomt/mellomrom. Det var altså et fungerende XPath-uttrykk, men ikke begrensende nok. Man kan også avdekke problemer med Instapaper: Jeg laget en konfigurasjon for Gamereactor.no, og av en eller annen grunn fjernet Instapaper alle lenker i hovedteksten som hadde identisk tekst med tittelen på artikkelen. Jeg omgikk dette problemet på en annen måte, men det var greit å sjekke at XPath-uttrykket mitt var riktig.

Oppsummering

Du har nå (med mindre du har hoppet rett til oppsummeringen, din snik) lært å konfigurere Instapapers tekstmotor ved hjelp av XPath. Dette er for spesielt interesserte (skyldig!) som vil gjøre verden bedre for seg selv og andre Instapaper-brukere. Da gjenstår det bare å ønske deg en god leseopplevelse, og ikke nøl med å spørre om du lurer på noe!

Noe du vil si?