Nå og da, utviklere trenger å skrape nettsider for å få litt informasjon fra et nettsted. For eksempel, la oss si at du jobber med et personlig prosjekt der du må få geografisk informasjon om hovedstader i forskjellige land fra Wikipedia. Å skrive inn dette manuelt vil ta mye tid. Du kan imidlertid gjøre det veldig fort ved å skrap Wikipedia-siden ved hjelp av PHP. Du vil også kunne automatisk analysere HTML-koden for å få spesifikk informasjon i stedet for å gå gjennom hele oppmerkningen manuelt.
I denne opplæringen vil vi lære om en rask, brukervennlig HTML-parser kalt DiDOM. Vi vil begynne med installasjonsprosessen og deretter lære å trekke ut informasjon fra ulike elementer på en nettside ved hjelp av forskjellige typer selektorer som tagger, klasser osv..
Du kan enkelt installere DiDOM i prosjektkatalogen ved å kjøre følgende kommando:
komponist krever imangazaliev / didom
Når du har kjørt kommandoen ovenfor, vil du kunne laste inn HTML fra en streng, en lokal fil eller en nettside. Her er et eksempel:
require_once ( 'leverandør / autoload.php'); bruk DiDom \ Document; $ document = nytt dokument ($ washington_dc_html_string); $ document = nytt dokument ('washington_dc.html', sant); $ url = 'https://en.wikipedia.org/wiki/Washington,_D.C.'; $ document = nytt dokument ($ url, true);
Når du bestemmer deg for å analysere HTML fra et dokument, kan det allerede lastes og lagres i en variabel. I slike tilfeller kan du bare passere denne variabelen til Dokument()
og DiDOM vil forberede strengen for parsing.
Hvis HTML-filen skal lastes fra en fil eller en URL, kan du sende den som den første parameteren til Dokument()
og sett den andre parameteren til ekte
.
Du kan også opprette en ny Dokument
objekt ved å bruke nytt dokument ()
uten noen parametere. I dette tilfellet kan du ringe metoden loadHtml ()
å laste inn HTML fra en streng og loadHtmlFile ()
å laste inn HTML fra en fil eller nettside.
Det første du må gjøre før du får HTML eller tekst fra et element, er å finne elementet selv. Den enkleste måten å gjøre det på er å bare bruke finne()
metode og passere CSS-velgeren for det tilsiktede elementet som den første parameteren.
Du kan også sende XPath til et element som den første parameteren til finne()
metode. Dette krever imidlertid at du skal passere Spørring :: TYPE_XPATH
som den andre parameteren.
Hvis du bare vil bruke XPath-verdier for å finne et HTML-element, kan du bare bruke xpath ()
metode i stedet for å passere Spørring :: TYPE_XPATH
som den andre parameteren til finne()
hver gang.
Hvis DiDOM kan finne elementer som samsvarer med CSS-velgeren eller XPATH-uttrykket, returnerer det en rekke forekomster av DiDom \ Element
. Hvis ingen slike elementer blir funnet, returnerer den en tom rekkefølge.
Siden disse metodene returnerer en matrise, kan du direkte få tilgang til det nth matchende elementet ved å bruke finne () [n-1]
.
I det følgende eksemplet vil vi få den indre HTML fra alle første og andre nivå overskriftene i Wikipedia artikkelen om Washington, D.C.
require_once ( 'leverandør / autoload.php'); bruk DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $ main_heading = $ document-> find ('h1.firstHeading') [0]; ekko $ main_heading-> html (); $ sub_headings = $ document-> find ('h2'); foreach ($ sub_headings som $ sub_heading) hvis ($ sub_heading-> text ()! == 'Se også') echo $ sub_heading-> html (); annet break;
Vi begynner med å opprette et nytt dokumentobjekt ved å sende URLen til Wikipedia-artikkelen om Washington, D.C. Etter det får vi hovedpostelementet ved hjelp av finne()
metode og lagre den inne i en variabel som kalles $ main_heading
. Vi vil nå kunne kalle forskjellige metoder på dette elementet som tekst()
, innerhtml ()
, html ()
, etc.
For hovedposten, kalder vi bare html ()
metode som returnerer HTML til hele overskriftselementet. På samme måte kan vi få HTML i et bestemt element ved å bruke innerhtml ()
metode. Noen ganger vil du være mer interessert i innholdet i vanlig tekst i et element i stedet for HTML-en. I slike tilfeller kan du bare bruke tekst()
metode og gjøres med det.
Nivå to overskrifter deler vår Wikipedia-side i veldefinerte seksjoner. Men du vil kanskje bli kvitt noen av disse underposisjonene som "Se også", "Notater", osv.
En måte å gjøre det på er å gå gjennom alle nivå to overskrifter og sjekke verdien returnert av tekst()
metode. Vi bryter ut av løkken hvis den returnerte overskriften er "Se også".
Du kan komme direkte til fjerde eller 6. nivå to overskriften ved å bruke $ Dokument-> finn ( 'h2') [3]
og $ Dokument-> finn ( 'h2') [5]
henholdsvis.
Når du har tilgang til et bestemt element, lar biblioteket deg krysse opp og ned DOM-treet for å få tilgang til andre elementer med letthet.
Du kan gå til overordnet av et HTML-element ved hjelp av ordnede ()
metode. På samme måte kan du komme til neste eller forrige søsken av et element ved hjelp av nextSibling ()
og previousSibling ()
fremgangsmåter.
Det finnes mange metoder for å få tilgang til barna til et DOM-element også. For eksempel kan du komme til et bestemt barnelement ved hjelp av barn (n)
metode. På samme måte kan du få tilgang til det første eller siste barnet til et bestemt element ved hjelp av første barn()
og siste barn()
metoder. Du kan sløyfe over alle barna til et bestemt DOM-element ved hjelp av barn ()
metode.
Når du kommer til et bestemt element, vil du kunne få tilgang til sin HTML etc. ved hjelp av html ()
, innerhtml ()
, og tekst()
fremgangsmåter.
I det følgende eksempelet begynner vi med nivå to overskriftelementer og fortsetter å sjekke om neste søskenelement inneholder litt tekst. Så snart vi finner et søskenelement med litt tekst, sender vi den ut til nettleseren.
require_once ( 'leverandør / autoload.php'); bruk DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $ sub_headings = $ document-> find ('h2'); for ($ i = 1; $ i < count($sub_headings); $i++) if($sub_headings[$i]->tekst ()! == 'Se også') $ next_sibling = $ sub_headings [$ i] -> nextSibling (); mens (! $ next_elem-> html ()) $ next_sibling = $ next_sibling-> nextSibling (); echo $ next_elem-> html (). "
"; else break;
Du kan bruke en lignende teknikk til å løpe gjennom alle søskenelementene og bare skrive ut teksten hvis den inneholder en bestemt streng eller hvis syskendeelementet er et stykkemerke osv. Når du vet det grunnleggende, er det lett å finne riktig informasjon.
Evnen til å få eller sette attributtverdien for forskjellige elementer kan vise seg å være svært nyttig i visse situasjoner. For eksempel kan vi få verdien av src attributt for alle img tagger i vår Wikipedia artikkel ved hjelp av $ Image_elem-> attr ( 'src')
. På samme måte kan du få verdien av href attributter for alle en koder i et dokument.
Det er tre måter å få verdien til et gitt attributt for et HTML-element. Du kan bruke getAttribute ( 'attrName')
metode og pass navnet på attributet du er interessert i som en parameter. Du kan også bruke attr ( 'attrName')
metode, som fungerer akkurat som getAttribute ()
. Endelig lar biblioteket deg også direkte få attributverdien ved å bruke $ Elem-> attrName
. Dette betyr at du kan få verdien av src Tilordne et bildeelement direkte ved å bruke $ ImageElem-> src
.
require_once ( 'leverandør / autoload.php'); bruk DiDom \ Document; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $ images = $ document-> find ('img'); foreach ($ bilder som $ bilde) echo $ image-> src. "
";
Når du har tilgang til src attributter, kan du skrive koden for å laste ned alle bildefiler automatisk. På denne måten vil du kunne spare mye tid.
Du kan også angi verdien av et gitt attributt ved hjelp av tre forskjellige teknikker. Først kan du bruke setAttribute ('attrName', 'attrValue')
metode for å angi attributtverdien. Du kan også bruke attr ('attrName', 'attrValue')
metode for å angi attributtverdien. Endelig kan du angi attributtverdien for et gitt element ved hjelp av $ Elem-> attrName = 'attrValue'
.
Du kan også gjøre endringer i det lastede HTML-dokumentet ved hjelp av ulike metoder som tilbys av biblioteket. For eksempel kan du legge til, erstatte eller fjerne elementer fra DOM-treet ved hjelp av appendChild ()
, erstatte()
, og fjerne()
fremgangsmåter.
Biblioteket lar deg også lage dine egne HTML-elementer for å legge dem til det opprinnelige HTML-dokumentet. Du kan opprette et nytt elementobjekt ved å bruke nytt element ('tagName', 'tagContent')
.
Husk at du vil få en Uncaught Error: Klassen 'Element' ikke funnet Feil hvis programmet ikke inneholder linjen bruk DiDom \ Element
før instantiating elementobjektet.
Når du har elementet, kan du enten legge det til andre elementer i DOM ved hjelp av appendChild ()
metode eller du kan bruke erstatte()
metode for å bruke det nylig instantiated elementet som erstatning for noen gamle HTML-elementer i dokumentet. Følgende eksempel skal bidra til å klargjøre dette konseptet ytterligere.
require_once ( 'leverandør / autoload.php'); bruk DiDom \ Document; bruk DiDom \ Element; $ document = new Document ('https://en.wikipedia.org/wiki/Washington,_D.C.', true); // Dette vil resultere i feil. echo $ document-> find ('h2.test-heading') [0] -> html (). "\ n"; $ test_heading = nytt element ('h2', 'Dette er test overskrift.'); $ test_heading-> class = 'test-heading'; $ Dokument-> finn ( 'h1') [0] -> erstatt ($ test_heading); echo $ document-> find ('h2.test-heading') [0] -> html (). "\ n";
I utgangspunktet er det ingen h2 element i dokumentet vårt med klassen test rubrikken. Derfor vil vi fortsette å få en feil hvis vi prøver å få tilgang til et slikt element.
Etter å ha bekreftet at det ikke finnes noe slikt, oppretter vi en ny h2 element og endre verdien av sin klasse tilskrive test rubrikken.
Deretter erstatter vi den første h1 element i dokumentet med vår nyopprettede h2 element. Bruker finne()
metode på dokumentet vårt igjen for å finne h2 på vei med klassen test rubrikken vil returnere et element nå.
Denne opplæringen dekket grunnleggende om PHP DiDOM HTML parseren. Vi begynte med installasjonen og lærte da å laste inn HTML fra en streng, en fil eller en URL. Etter det diskutert vi hvordan du finner et bestemt element basert på CSS-velgeren eller XPath. Vi lærte også å få søsken, foreldrene eller barna til et element. Resten av seksjonene dekket hvordan vi kan manipulere attributter til et bestemt element eller legge til, fjerne og erstatte elementer i et HTML-dokument.
.