Exemple de interogări xpath către html. Aplicarea axei precedente. Funcții standard XPath

Exemple de utilizare a xpath din practica analizării informațiilor de pe site-uri web. Sunt afișate secțiuni de cod xpath.

Obțineți textul titlului h1

//h1/text()

Obține textul titlului cu clasa productName

//h1[@class="productName"]/text()

Obțineți valoarea unui interval specific în funcție de clasă

//span[@class="preț"]

Obțineți valoare atributul titlului pentru un buton cu clasa addtocart_button

//input[@class="addtocart_button"]/@title

//un text()

//a/@href

Imagine src

//img/@src

Imaginea imediat după anumit elementîn DOM, următorul ax

//h1[@class="produnctName"]//following::div/img/@src

Imagine în 4 div în funcție de cont

//div/img/@src

XPath(XML Path Language) - un limbaj pentru interogarea elementelor documentului XML. Conceput pentru a oferi acces la piese document XMLîn dosare Transformări XSLTși este un standard W3C. XPath este conceput pentru a implementa navigarea DOM în XML.

XML are o structură arborescentă. Un element arbore are întotdeauna descendenți și strămoși, cu excepția element rădăcină, care nu are strămoși, precum și elemente de fund (frunze de copac), care nu au descendenți.

La fiecare pas al traseului sunt selectate elemente care indeplinesc conditiile de selectie la acest pas, iar ca urmare a accesarii documentului de-a lungul traseului se obtine un set de elemente care satisfac aceasta cale.

Funcții peste seturi de noduri

  • * - denotă orice un nume sau un set de caractere de-a lungul axei specificate, de exemplu: * - orice nod copil; @* — orice atribut.
  • $nume - acces la o variabilă, unde nume este numele variabilei sau al parametrului.
  • conditii suplimentare mostre sau, ceea ce este același lucru, un predicat pas de adresare. Trebuie să conțină o valoare booleană. Dacă conține o valoare numerică, se consideră că este numărul de serie al nodului, ceea ce echivalează cu prefixarea acestui număr cu expresia „position()=”
  • () - dacă este folosit în interiorul unei etichete dintr-o altă limbă (de exemplu HTML), atunci procesorul XSLT consideră conținutul acoladelor drept un XPath.
  • / - determină nivelul arborelui, adică separă etapele de adresare
  • | — combină rezultatul. Adică, puteți scrie mai multe căi de analiză folosind semnul |. iar rezultatul unei astfel de expresii va include tot ceea ce se găsește pe oricare dintre aceste căi.
  • set de noduri nodul()

Returnează toate nodurile. Înlocuitorul „*” este adesea folosit în locul acestei funcții, dar spre deosebire de asterisc, funcția node() returnează de asemenea text noduri.

  • şir text()

Returnează un set de noduri text;

  • set de noduri actual()

Returnează un set de un element care este cel curent. Dacă procesăm un set cu condiții, atunci singura modalitate de a ajunge la elementul curent din această condiție este această funcție.

  • număr poziţie()

Returnează poziția unui element într-o mulțime. Funcționează corect numai într-o buclă

  • număr ultimul()

Returnează numărul ultimului element dintr-un set. Funcționează corect numai într-o buclă

  • număr numara(set de noduri)

Returnează numărul de elemente dintr-un set de noduri.

  • şir Nume(set de noduri?)

Se intoarce Numele complet prima etichetă din set.

  • şir namespace-uri(set de noduri?)
  • şir nume-local(set de noduri?)

Returnează numele primei etichete din set, fără spațiu de nume.

  • set de noduri id(obiect)

Găsește un element cu un identificator unic

Topoarele sunt baza limbajul XPath. Unele axe au abrevieri.

  • strămoş::- Returnează mulți strămoși.
  • strămoș sau sine::— Returnează setul de strămoși și elementul curent.
  • atribut::— Returnează un set de atribute ale elementului curent. Acest apel poate fi înlocuit cu «@»
  • copil::— Returnează un set de copii cu un nivel mai jos. Acest nume este abreviat complet, adică poate fi omis cu totul.
  • descendent::— Returnează setul complet de copii (adică atât copiii imediati, cât și toți copiii lor).
  • descendent-sau-sine::— Returnează setul complet de copii și elementul curent. Expresia „/descendant-or-self::node()/” poate fi scurtată la «//» . Folosind această axă, de exemplu, puteți organiza selecția elementelor din orice nod, și nu doar din cel rădăcină, ca un al doilea pas: este suficient să luați ca prim pas toți descendenții rădăcinii. De exemplu, calea „//span” va selecta toate nodurile span ale documentului, indiferent de poziția lor în ierarhie, uitându-se atât la numele elementului rădăcină, cât și la numele tuturor copiilor acestuia, la adâncimea completă a acestora. cuibărit.
  • ca urmare a::— Returnează setul brut sub elementul curent.
  • următorul-frate::— Returnează setul de elemente la același nivel după cel curent.
  • spatiu de nume::— Returnează un set care are un spațiu de nume (adică este prezent atributul xmlns).
  • mamă::— Returnează strămoșul cu un nivel înapoi. Acest apel poate fi înlocuit cu «..»
  • precedent:— Returnează setul de elemente procesate, excluzând setul de strămoși.
  • frate-precedent::— Returnează setul de elemente la același nivel anterior celui curent.
  • de sine::— Returnează elementul curent. Acest recurs poate fi înlocuit cu «.»

XPath este un limbaj de interogare pentru elementele de document xml sau xhtml. La fel ca SQL, xpath este un limbaj de interogare declarativ. Pentru a obține datele de interes, trebuie doar să creați o interogare care să descrie aceste date. Interpretul de limbă xpath va face toată munca murdară pentru tine.
Foarte convenabil, nu-i așa? Să vedem ce capabilități oferă xpath pentru accesarea nodurilor paginii web.

Crearea unei cereri către nodurile paginii web

Vă prezint atenției un mic munca de laborator, în timpul căruia voi demonstra crearea solicitărilor xpath către o pagină web. Vei putea repeta cererile pe care le-am dat și, cel mai important, vei încerca să le îndeplinești pe ale tale. Sper că datorită acestui lucru, articolul va fi la fel de interesant pentru începători și programatori familiarizați cu xpath to xml.

Pentru laborator vom avea nevoie de:
- pagina web xhtml;
- Browser Mozilla Firefox cu suplimente;
- firebug;
- firePath;
(puteți folosi orice alt browser cu suport vizual xpath)
- un pic de timp.

Ca pagină web pentru desfășurarea experimentului, propun pagina principală a site-ului consorțiului world wide web("http://w3.org"). Această organizație este cea care dezvoltă limbajele xquery(xpath), specificația xhtml și multe alte standarde de internet.

Sarcină
Obțineți din codul xhtml pagina principala Informații w3.org despre conferințele consorțiului folosind interogări xpath.
Să începem să scriem interogări xpath.
Prima solicitare XPat
Deschideți fila Firepath în FireBug, selectați elementul de analizat cu selectorul, faceți clic pe: Firepath a creat o solicitare xpath pentru elementul selectat.

Dacă ați selectat titlul primului eveniment, atunci cererea va fi astfel:

După eliminarea indecșilor care nu sunt necesari, interogarea se va potrivi cu toate elementele de tip antet.

Firepath evidențiază elementele care se potrivesc cu interogarea. Puteți vedea în timp real care noduri de document se potrivesc cu interogarea.

Cerere de informații despre locațiile conferinței:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Iată cum obținem o listă de sponsori:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

sintaxa xpath

Să ne întoarcem la interogările pe care le-am creat și să înțelegem cum sunt structurate.
Să luăm în considerare prima cerere în detaliu

În această interogare am împărțit trei părți pentru a demonstra capabilitățile xpath. (Diviziunea în părți este dificilă)

Prima parte
.// - coborâre recursivă zero sau mai multe niveluri ierarhice din contextul curent. În cazul nostru, contextul actual este rădăcina documentului

A doua parte
* - orice element,
[@id="w3c_home_upcoming_events"]– un predicat pe baza căruia căutăm un nod care are un atribut id egal cu „w3c_home_upcoming_events”. ID-urile elementelor XHTML trebuie să fie unice. Prin urmare, interogarea „orice element cu un anumit ID” ar trebui să returneze singurul nod pe care îl căutăm.

Putem înlocui * la numele exact al nodului divîn această cerere
div[@id="w3c_home_upcoming_events"]

Astfel, coborâm în arborele documentului la nodul div[@id="w3c_home_upcoming_events"] de care avem nevoie. Nu ne interesează deloc în ce noduri constă arborele DOM și câte niveluri de ierarhie rămân deasupra.

A treia parte
/ul/li/div/p/a–xpath este calea către un anumit element. Calea constă în pași de adresare și condiții de verificare a nodurilor (ul, li etc.). Pașii sunt separați de un caracter „/” (slash).

colecții xpath
Nu este întotdeauna posibil să accesați nodul de interes folosind un predicat sau pași de adresare. Foarte des există multe noduri de același tip la un nivel de ierarhie și este necesar să selectați noduri „doar primul” sau „doar al doilea”. În astfel de cazuri sunt oferite colecții.

colecțiile xpath vă permit să accesați un element prin indexul său. Indicii corespund ordinii în care au fost prezentate elementele în documentul original. Numărul de serie din colecții se numără de la unu.

Pe baza faptului că „locul” este întotdeauna al doilea paragraf după „numele conferinței”, obținem următoarea interogare:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Unde p este al doilea element din mulțime pentru fiecare nod din listă /ul/li/div.

În mod similar, putem obține o listă de sponsori cu cererea:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Unele funcții xpath
Există multe funcții în xpath pentru a lucra cu elemente dintr-o colecție. Voi da doar câteva dintre ele.

ultimul():
Returnează ultimul element al colecției.
Interogarea ul/li/div/p - va returna ultimele paragrafe pentru fiecare nod al listei „ul”.
Funcția first() nu este furnizată. Pentru a accesa primul element, utilizați indexul „1”.

text():
Returnează conținutul de testare al unui element.
.//a – primim toate linkurile cu textul „Arhivă”.

poziție() și mod:
position() - returnează poziția unui element dintr-o mulțime.
mod este restul diviziei.

Prin combinarea acestor funcții putem obține:
- Nu chiar elemente ul/li
- elemente pare: ul/li

Operații de comparație

  • < - логическое «меньше»
  • > - logic „mai mare decât”
  • <= - логическое «меньше либо равно»
  • >= - logic „mai mare decât sau egal”
ul/li , ul/li - listează elemente începând de la al 3-lea număr și invers.

Pe cont propriu

Incearca sa obtii:
- chiar Adresa URL a linkului din meniul din stânga „Standarde”;
- anteturile tuturor știrilor, cu excepția primei de pe pagina principală a w3c.org.

XPath în PHP5

$dom = nou DomDocument(); $dom->loadHTML($HTMLCode); $xpath = nou DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )

In cele din urma

Pe exemplu simplu Am văzut puterea xpath de a accesa nodurile paginilor web.
Xpath este standardul industrial pentru accesarea elementelor xml și transformărilor xhtml, xslt.
Îl puteți folosi pentru a analiza orice pagină html. Dacă codul html sursă conține erori semnificative în marcaj, rulați-l

Sintaxa scurtă XPath

Comenzile rapide pentru sintaxa XPath pot fi destul de convenabile. Mai jos sunt regulile:

Self::node() poate fi scurtat ca. ;

Parent::node() poate fi prescurtat ca.. ;

Copil::nume copil poate fi prescurtat ca nume de copil ;

Attribute::childname poate fi prescurtat ca @childname ;

/descendent-or-self::node()/ poate fi prescurtat ca // .

De exemplu, calea locației.//PLANET este prescurtarea pentru self::node()/descendant-or-self::node()/child::PLANET . De asemenea, puteți abrevia expresia predicat ca , ca , etc. Lucrul cu căile XPath folosind sintaxa scurtă este mult mai ușor. Următoarea listă oferă un număr de exemple de căi de locație folosind sintaxa scurtată:

PLANET intoarce copii Nod context;

* returnează toți copiii nodului context;

Text() returnează toate nodurile text copil ale nodului context;

@UNITS returnează atributul UNITS al nodului context;

@* returnează toate atributele nodului context;

PLANET se întoarce al treilea copil Nod context;

PLANET întoarce ultimul copil Nod context;

*/PLANET returnează toți nepoții Nod context;

/PLANETS/PLANETA/NUME returnează al doilea element al treilea element element

//PLANET returnează toți copiii Rădăcina documentului;

PLANETS//PLANET returnează elemente descendente Elemente copil Nod context;

//PLANETA/NUMELE returnează toate elementele care au un părinte

Returnează nodul context în sine;

.//PLANET returnează elemente descendente Nod context;

Returnează părintele nodului context;

../@UNITS returnează atributul UNITS al părintelui nodului context;

.//.. returnează toți părinții fiului nodului context și părintele nodului context;

PLANET aduce copiii înapoi ;

PLANET aduce copiii înapoi Noduri de context care au copii cu text egal cu „Venus”;

PLANET[@UNITS="zile"] returnează toți copiii Noduri de context care au un atribut UNITS cu valoarea „zile”;

PLANET[@UNITS="zile"] revine al șaselea copil Nodul context numai dacă acest copil are un atribut UNITS cu valoarea „zile”. De asemenea, puteți scrie PLANET[@UNITS="zile"] ;

PLANET[@COLOR și @UNITS] returnează toți copiii Nodurile de context care au Atributul COLORși atributul UNITS;

" //PLANET " selectează toate elementele A cărui valoare este diferită de valoarea oricărui element precedent

* selectează orice element cine este primul copil al părintelui său;

*[@UNITS] selectează primii cinci copii ai nodului context care au atributul UNITS.

Din cartea Procesarea bazei de date în Visual Basic®.NET autor McManus Geoffrey P

Din cartea Programare în Limba rubin[Ideologia limbajului, teoria și practica aplicării] de Fulton Hal

Din cartea PHP Reference a autorului

Din cartea XSLT autor Holzner Stephen

Sintaxă scurtă Pentru modele, există două reguli pentru scurtarea axelor: child::childname poate fi scurtat ca childname; attribute::childname poate fi scurtat ca @childname. Următoarea listă oferă un număr de modele de exemplu cu sintaxa scurtată; la finalul capitolului vei vedea

Din cartea XSLT Technology autor Valikov Alexey Nikolaevici

Sintaxă a predicatului scurt Expresiile predicatelor pot fi scurtate omițând „position()=". De exemplu, devine, devine etc. Utilizarea sintaxei scurte face mult mai ușoară utilizarea expresiilor XPath în predicate. Iată un rând

Din cartea C++. Culegere de retete autor Diggins Christopher

Din cartea autorului

Numere XPath XPath stochează numere în format virgulă mobilă precizie dubla. Prin definiție formală, numerele XPath trebuie să fie stocate în format IEEE 754 64 de biți cu precizie dublă în virgulă mobilă, iar toate numerele sunt stocate ca numere în virgulă mobilă

Din cartea autorului

Utilizarea axelor XPath În acest moment, ne-am uitat la cele trei părți ale pașilor de aspect - axa, condiția nodului și predicatul. Ar trebui să fiți familiarizați cu aceste elemente din munca pe care am făcut-o cu modelele de selecție, dar observați axa din exemplul anterior - preceding-frate. Încă

Din cartea autorului

Testarea expresiilor XPath Pachetul Xalan include un exemplu de program la îndemână, ApplyXPath.java, care vă permite să aplicați o expresie XPath unui document și să vedeți rezultatul, ceea ce este foarte util pentru testare. Pentru a rula acest exemplu, va trebui să compilați ApplyXPath.java în ApplyXPath.class la

2 martie 2011 la 20:49

Exemple de solicitări xpath către html

  • Dezvoltare site

XPath este un limbaj de interogare pentru elementele de document xml sau xhtml. La fel ca SQL, xpath este un limbaj de interogare declarativ. Pentru a obține datele de interes, trebuie doar să creați o interogare care să descrie aceste date. Interpretul de limbă xpath va face toată munca murdară pentru tine.
Foarte convenabil, nu-i așa? Să vedem ce capabilități oferă xpath pentru accesarea nodurilor paginii web.

Crearea unei cereri către nodurile paginii web

Vă aduc în atenție o mică lucrare de laborator, în cadrul căreia voi demonstra crearea de solicitări xpath către o pagină web. Vei putea repeta cererile pe care le-am dat și, cel mai important, vei încerca să le îndeplinești pe ale tale. Sper că datorită acestui lucru, articolul va fi la fel de interesant pentru începători și programatori familiarizați cu xpath to xml.

Pentru laborator vom avea nevoie de:
- pagina web xhtml;
- Browser Mozilla Firefox cu suplimente;
- firebug;
- firePath;
(puteți folosi orice alt browser cu suport vizual xpath)
- un pic de timp.

Ca pagină web pentru realizarea unui experiment, propun pagina principală a site-ului World Wide Web Consortium ("http://w3.org"). Această organizație este cea care dezvoltă limbajele xquery(xpath), specificația xhtml și multe alte standarde de internet.

Sarcină
Preluați informații despre conferințele consorțiului din codul xhtml al paginii principale w3.org folosind interogări xpath.
Să începem să scriem interogări xpath.
Prima solicitare XPat
Deschideți fila Firepath în FireBug, selectați elementul de analizat cu selectorul, faceți clic pe: Firepath a creat o solicitare xpath pentru elementul selectat.

Dacă ați selectat titlul primului eveniment, atunci cererea va fi astfel:

După eliminarea indecșilor care nu sunt necesari, interogarea se va potrivi cu toate elementele de tip antet.

Firepath evidențiază elementele care se potrivesc cu interogarea. Puteți vedea în timp real care noduri de document se potrivesc cu interogarea.

Cerere de informații despre locațiile conferinței:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Iată cum obținem o listă de sponsori:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

sintaxa xpath

Să ne întoarcem la interogările pe care le-am creat și să înțelegem cum sunt structurate.
Să luăm în considerare prima cerere în detaliu

În această interogare am împărțit trei părți pentru a demonstra capabilitățile xpath. (Diviziunea în părți este dificilă)

Prima parte
.// - coborâre recursivă la zero sau mai multe niveluri de ierarhie din contextul actual. În cazul nostru, contextul actual este rădăcina documentului

A doua parte
* - orice element,
[@id="w3c_home_upcoming_events"]– un predicat pe baza căruia căutăm un nod care are un atribut id egal cu „w3c_home_upcoming_events”. ID-urile elementelor XHTML trebuie să fie unice. Prin urmare, interogarea „orice element cu un anumit ID” ar trebui să returneze singurul nod pe care îl căutăm.

Putem înlocui * la numele exact al nodului divîn această cerere
div[@id="w3c_home_upcoming_events"]

Astfel, coborâm în arborele documentului la nodul div[@id="w3c_home_upcoming_events"] de care avem nevoie. Nu ne interesează deloc în ce noduri constă arborele DOM și câte niveluri de ierarhie rămân deasupra.

A treia parte
/ul/li/div/p/a–xpath este calea către un anumit element. Calea constă în pași de adresare și condiții de verificare a nodurilor (ul, li etc.). Pașii sunt separați de un caracter „/” (slash).

colecții xpath
Nu este întotdeauna posibil să accesați nodul de interes folosind un predicat sau pași de adresare. Foarte des există multe noduri de același tip la un nivel de ierarhie și este necesar să selectați noduri „doar primul” sau „doar al doilea”. În astfel de cazuri sunt oferite colecții.

colecțiile xpath vă permit să accesați un element prin indexul său. Indicii corespund ordinii în care au fost prezentate elementele în documentul original. Numărul de serie din colecții se numără de la unu.

Pe baza faptului că „locul” este întotdeauna al doilea paragraf după „numele conferinței”, obținem următoarea interogare:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Unde p este al doilea element din mulțime pentru fiecare nod din listă /ul/li/div.

În mod similar, putem obține o listă de sponsori cu cererea:
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Unele funcții xpath
Există multe funcții în xpath pentru a lucra cu elemente dintr-o colecție. Voi da doar câteva dintre ele.

ultimul():
Returnează ultimul element al colecției.
Interogarea ul/li/div/p - va returna ultimele paragrafe pentru fiecare nod al listei „ul”.
Funcția first() nu este furnizată. Pentru a accesa primul element, utilizați indexul „1”.

text():
Returnează conținutul de testare al unui element.
.//a – primim toate linkurile cu textul „Arhivă”.

poziție() și mod:
position() - returnează poziția unui element dintr-o mulțime.
mod este restul diviziei.

Prin combinarea acestor funcții putem obține:
- nici măcar elemente ul/li
- elemente pare: ul/li

Operații de comparație

  • < - логическое «меньше»
  • > - logic „mai mare decât”
  • <= - логическое «меньше либо равно»
  • >= - logic „mai mare decât sau egal”
ul/li , ul/li - listează elemente începând de la al 3-lea număr și invers.

Pe cont propriu

Incearca sa obtii:
- chiar și link-uri URL din meniul din stânga „Standarde”;
- anteturile tuturor știrilor, cu excepția primei de pe pagina principală a w3c.org.

XPath în PHP5

$dom = nou DomDocument(); $dom->loadHTML($HTMLCode); $xpath = nou DomXPath($dom); $_res = $xpath->query(".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue; )

In cele din urma

Folosind un exemplu simplu, am văzut capabilitățile xpath pentru accesarea nodurilor paginii web.
Xpath este standardul industrial pentru accesarea elementelor xml și transformărilor xhtml, xslt.
Îl puteți folosi pentru a analiza orice pagină html. Dacă codul html sursă conține erori semnificative în marcaj, rulați-l