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”
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
* 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
PLANET întoarce ultimul copil
*/PLANET returnează toți nepoții
/PLANETS/PLANETA/NUME returnează al doilea element //PLANET returnează toți copiii PLANETS//PLANET returnează elemente descendente //PLANETA/NUMELE returnează toate elementele Returnează nodul context în sine; .//PLANET returnează elemente descendente 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 PLANET[@UNITS="zile"] returnează toți copiii PLANET[@UNITS="zile"] revine al șaselea copil PLANET[@COLOR și @UNITS] returnează toți copiii " //PLANET " selectează toate elementele * selectează orice element *[@UNITS] selectează primii cinci copii ai nodului context care au atributul UNITS. 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 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 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ă 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ă 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 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. Pentru laborator vom avea nevoie de: 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. 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: Iată cum obținem o listă de sponsori: Î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 A doua parte Putem înlocui *
la numele exact al nodului divîn această cerere 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 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: În mod similar, putem obține o listă de sponsori cu cererea: ultimul(): text(): poziție() și mod: Prin combinarea acestor funcții putem obține: Operații de comparațieExemple de solicitări xpath către html
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.
- pagina web xhtml;
- Browser Mozilla Firefox cu suplimente;
- firebug;
- firePath;
(puteți folosi orice alt browser cu suport vizual xpath)
- un pic de timp.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.
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/psintaxa 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
.//
- coborâre recursivă la zero sau mai multe niveluri de ierarhie din contextul actual. În cazul nostru, contextul actual este rădăcina documentului
*
- 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.
div[@id="w3c_home_upcoming_events"]
/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.
.//*[@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.
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/pUnele 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.
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”.
Returnează conținutul de testare al unui element.
.//a – primim toate linkurile cu textul „Arhivă”.
position() - returnează poziția unui element dintr-o mulțime.
mod este restul diviziei.
- nici măcar elemente ul/li
- elemente pare: ul/li
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