Hvis du trenger å analysere HTML, er regulære uttrykk ikke veien å gå. I denne opplæringen lærer du hvordan du bruker en åpen kildekode, lett lært parser, for å lese, endre og spytte tilbake HTML fra eksterne kilder. Ved hjelp av nettnøtter som et eksempel, lærer du hvordan du får en liste over alle artiklene publisert på nettstedet og viser dem.
Forresten, kan du også finne parsers på Envato Market, for eksempel HTML5 Parser.
HTML5 Parser på Envato MarketDet første du må gjøre er å laste ned en kopi av simpleHTMLdom-biblioteket, fritt tilgjengelig fra sourceforge.
Det er flere filer i nedlastingen, men den eneste du trenger er filen simple_html_dom.php; Resten er eksempler og dokumentasjon.
Dette biblioteket er veldig enkelt å bruke, men det er noen grunnleggende ting du bør vurdere før du legger den til handling.
$ html = new simple_html_dom (); // Last fra en streng $ html-> load ('Hei Verden!
Var her
'); // Legg inn en fil $ html-> load_file ('http://net.tutsplus.com/');
Du kan opprette ditt opprinnelige objekt enten ved å laste inn HTML fra en streng eller fra en fil. Lasting av en fil kan gjøres enten via URL eller via ditt lokale filsystem.
En advarsel: Metoden load_file () delegerer jobben sin til PHPs file_get_contents. Hvis allow_url_fopen ikke er satt til sant i php.ini-filen, kan det hende du ikke kan åpne en ekstern fil på denne måten. Du kan alltid falle tilbake på CURL-biblioteket for å laste inn eksterne sider i dette tilfellet, og deretter lese dem inn med metoden load ().
Når du har DOM-objektet ditt, kan du begynne å jobbe med det ved å bruke finn () og lage samlinger. En samling er en gruppe objekter funnet via en väljare - syntaksen er ganske lik jQuery.
Hei Verden!
Var her.
I dette eksempelet HTML skal vi se på hvordan du får tilgang til informasjonen i andre ledd, endre den, og deretter utdatere resultatene.
# opprett og last HTML-koden ('simple_html_dom.php'); $ html = new simple_html_dom (); $ HTML-> load ("Hei Verden!
Var her
"); # få et element som representerer andre ledd $ element = $ html-> finn (" p "); # endre det $ element [1] -> innertext. =" output det! echo $ html-> save ();
Ved hjelp av metoden find (), returneres alltid en samling (array) av koder, med mindre du angir at du bare vil ha det nte barnet, som en andre parameter.
Linjer 2-4: Legg inn HTML-koden fra en streng, som forklart tidligere.
Linje 7: Denne linjen finner alle
tagger i HTML, og returnerer dem som en matrise. Første ledd vil ha en indeks på 0, og etterfølgende avsnitt vil bli indeksert tilsvarende.
linje 10: Dette åpner det andre elementet i vår samling av avsnitt (indeks 1), og legger til tillegg til sin innertextattributt. Innertext representerer innholdet mellom kodene, mens outertext representerer innholdet inkludert taggen. Vi kunne erstatte taggen helt ved å bruke outertext.
Vi skal legge til en linje, og endre klassen av vårt andre avsnitt-tag.
$ element [1] -> class = "class_name"; ekko $ html-> lagre ();
Den resulterende HTML-filen for lagre-kommandoen ville være:
Hei Verden!
Vi er her, og vi er her for å bli.
Her er noen andre eksempler på selektorer. Hvis du har brukt jQuery, vil disse virke godt kjent.
# få den første forekomsten av $ single = $ html-> find ('# foo', 0); # få alle elementene med $ collection = $ html-> find ('. foo'); # få alle ankerkoder på en side $ collection = $ html-> find ('a'); # få alle ankerkoder som er inne i H1-koder $ collection = $ html-> find ('h1 a'); # få alle img-koder med tittelen 'himom' $ collection = $ html-> find ('img [title = himom]');
Det første eksemplet er ikke helt intuitivt - alle spørringer som standard returneringssamlinger, til og med en ID-spørring, som bare skal returnere et enkelt resultat. Men ved å spesifisere den andre parameteren, sier vi "bare returnere det første elementet i denne samlingen".
Dette betyr at $ single er et enkelt element, snarere enn en rekke elementer med ett element.
Resten av eksemplene er selvforklarende.
Komplett dokumentasjon på biblioteket finner du på prosjektdokumentasjonssiden.
For å sette dette biblioteket i gang, skal vi skrive et raskt skript for å skrape innholdet på Nettuts nettside, og lage en liste over artikler som er tilstede på nettstedet etter tittel og beskrivelse ... bare som et eksempel. Skraping er et vanskelig sted på nettet, og bør ikke utføres uten tillatelse.
omfatte ( 'simple_html_dom.php'); $ articles = array (); getArticles ( 'http://net.tutsplus.com/page/76/');
Vi starter med å inkludere biblioteket, og kaller getArticles-funksjonen med siden vi ønsker å begynne å analysere. I dette tilfellet begynner vi nær slutten og er snill mot Nettuts server.
Vi erklærer også et globalt utvalg for å gjøre det enkelt å samle all artikkelinformasjon på ett sted. Før vi begynner parsing, la oss se på hvordan en artikkel sammendrag er beskrevet på Nettuts+.
Dette representerer et grunnleggende innleggformat på nettstedet, inkludert kildekoden kommentarer. Hvorfor er kommentarene viktige? De regner som noder til parseren.
funksjon getArticles ($ side) global $ articles; $ html = new simple_html_dom (); $ HTML-> load_file ($ side); //… mer…
Vi starter veldig enkelt ved å hevde vår globale, opprette et nytt simple_html_dom-objekt, og laster deretter inn siden vi vil analysere. Denne funksjonen skal ringe seg senere, så vi setter opp det for å godta nettadressen som en parameter.
$ items = $ html-> find ('div [class = forhåndsvisning]'); foreach ($ poster som $ post) # husk kommentarer teller som noder $ artikler [] = array ($ post-> barn (3) -> outertext, $ post-> barn (6) -> first_child () -> outertext );
Dette er kjøttet i getArticles-funksjonen. Det kommer til å ta en nærmere titt for å virkelig forstå hva som skjer.
Linje 1: Oppretter en rekke elementer - div er med klassen av forhåndsvisning. Vi har nå en samling artikler lagret i $ elementer.
Linje 5: $ post refererer nå til en enkelt div av forhåndsvisning av klassen. Hvis vi ser på den opprinnelige HTML, kan vi se at det tredje barnet er H1 som inneholder artikkeltittelen. Vi tar det og tildeler det til $ articles [index] [0].
Husk å starte ved 0 og telle kommentarer når du prøver å bestemme riktig indeks for en barnekode.
Linje 6: Det sjette barnet på $ innlegget er
$ articles [0] [0] = "Min artikkelnavn her"; $ articles [0] [1] = "Dette er artikkelbeskrivelsen min"
Det første vi gjør er å finne ut hvordan du finner vår neste side. På Nettuts + er nettadressene enkle å finne ut, men vi skal late som de ikke er, og få den neste linken ved å parsing.
Hvis vi ser på HTML, ser vi følgende:
"
Hvis det er en neste side (og det vil ikke alltid være), finner vi et anker med klassen "nextpostslink". Nå kan informasjonen bli brukt.
hvis ($ next = $ html-> find ('a [class = nextpostslink]', 0)) $ URL = $ next-> href; $ HTML-> klart (); unset ($ html); getArticles ($ url);
På første linje ser vi om vi kan finne et anker med klassen nextpostslink. Vær spesielt oppmerksom på den andre parameteren for finn (). Dette spesifiserer at vi bare vil at det første elementet (indeks 0) av den funnet samlingen returneres. $ next vil bare holde et enkelt element, i stedet for en gruppe elementer.
Deretter tilordner vi linkens HREF til variabelen $ URL. Dette er viktig fordi vi er i ferd med å ødelegge HTML-objektet. På grunn av en php5 sirkulær referanse minne lekkasje, må det nåværende simple_html_dom objektet slettes og avinstalleres før en annen er opprettet. Hvis du ikke gjør det, kan det føre til at du spiser alt tilgjengelig minne.
Til slutt, vi kaller getArticles med nettadressen til neste side. Denne rekursjonen slutter når det ikke er flere sider å analysere.
Først skal vi sette opp noen grunnleggende stylings. Dette er helt vilkårlig - du kan gjøre utdataene dine ser uansett.
#main margin: 80px auto; bredde: 500 piksler; h1 font: fet 40px / 38px helvetica, verdana, sans-serif; margin: 0; h1 a farge: # 600; text-decoration: none; p bakgrunn: #ECECEC; skrifttype: 10px / 14px verdana, sans-serif; margin: 8px 0 15px; grense: 1px #CCC solid; polstring: 15px; .item polstring: 10px;
Deretter skal vi legge en liten bit av PHP på siden for å utdata den tidligere lagrede informasjonen.
"; ekko $ element [0]; ekko $ element [1]; ekko"
Det endelige resultatet er en enkelt HTML-side som viser alle artiklene, begynner på siden angitt av det første getArticles () -samtalen.
Hvis du analyserer mange sider (si hele nettstedet), kan det ta lengre tid enn den maksimale eksekveringstiden som er tillatt av serveren din. For eksempel, kjører fra min lokale maskin tar det omtrent ett sekund per side (inkludert tid for å hente).
På et nettsted som Nettuts, med en nåværende 78 sider med opplæringsprogrammer, vil dette gå over ett minutt.
Denne opplæringen bør komme i gang med HTML-parsing. Det finnes andre metoder for å jobbe med DOM, inkludert PHP er innebygd i en, som lar deg arbeide med kraftige xpath-seleksorer for å finne elementer. For enkel bruk og rask start finner jeg dette biblioteket som en av de beste. Som avslutningsnote må du alltid huske å få tillatelse før du skraper et nettsted. dette er viktig. Takk for at du leste!