HTML-parsing en scraping met behulp van een eenvoudige HTML DOM-bibliotheek. HTML-sjablonen maken met PHP

Terwijl ik aan website-updates werkte, merkte ik mijn oude lay-out op toen ik nog nieuw was bij PHP. Rekening houdend met de opgedane ervaring, zijn de tekortkomingen van de oude lay-outmethode zichtbaar wanneer HTML PHP framet en zich er niet in bevindt.

Helaas heb ik niets interessants gevonden over dit onderwerp om te lezen hoe je het het beste kunt opmaken. Toen ik echter naar moderne lay-outcode keek, merkte ik steeds vaker dat HTML zich bijna altijd binnen php-structuren bevindt. En daar zitten aanzienlijke voordelen aan.

Laten we eens kijken naar de voordelen van HTML in PHP met behulp van het voorbeeld van header-uitvoer in WordPress.

Hieronder staat een constructie uit het volgende type code: als er gegevens in een bepaald custom field staan, dan tonen we een header met deze gegevens. Ik heb de lay-outcode in de oorspronkelijke vorm genomen, zoals voorheen. Hij zag er zo uit:

< ! -- Title -- >

< h3 class = "archive-entry-title" itemprop = "name" > < a href = " " rel = "bladwijzer" title = " !}" > ID , "name_rus" , true ) ) : ?>ID, "naam_rus", waar); ?> < / a > < / h3 >

< ! -- Title End -- >

Er zijn verschillende nadelen aan dit codeontwerp. Ten eerste is het niet visueel: alles is op één regel geschreven. Dit is met opzet gedaan, zodat er geen sprake zou zijn lege ruimtes tussen tags H1, H2, H3. Er is tenslotte niets goeds aan het hebben van spaties in de title-tags. Het is onmogelijk om te voorspellen, zoals in dit geval zoekmachines, dit heeft invloed op de site. Of extra spaties de kracht van de titel zullen verminderen of niet. Aangezien er geen antwoorden zijn op een dergelijke vraag, moet men van het ergste uitgaan. En schrijf daarom samen.

Anders, in vervolg op wat er is gezegd, als we de bovenstaande code visueel maken:

< ! -- Title -- >

< h3 class = "archive-entry-title" itemprop = "name" >

< a href = " " rel = "bladwijzer" title = " !}" >

ID , "name_rus" , true ) ) : ?>

ID, "naam_rus", waar); ?>

< / a >

< / h3 >

< ! -- Title End -- >

Toen bij binnenkijken HTML-browser van de paginacode in de header van de h3-tags zien we het volgende:

We hebben ook nodig dat de code gemakkelijk te lezen is tijdens het bewerken en dat deze ook naadloos wordt weergegeven bij het laden van de site. Namelijk, zodat het er zo uitziet:

Om dit te doen, moet je PHP gebruiken en het geheel inpakken html-code erin. En we krijgen het volgende beeld php-code voor WordPress-header:

< ! -- Title -- >

Als PHP nieuw voor je is, moet je enkele definities kennen.
Allereerst is PHP een programmeertaal en wordt gebruikt voor het schrijven van opdrachten (scripts) die aan de server zijn gericht. Om het nog eenvoudiger te zeggen: wanneer PHP-hulp we kunnen communiceren met de server.
PHP-opdrachten kunnen eenvoudig worden ingesloten in HTML-pagina's. Het is deze eigenschap die dat is belangrijk voordeel PHP-taal vóór talen als Perl en C.

PHP-syntaxis

PHP-scriptcode begint na de openingstag. De tekst tussen deze twee tags wordt gelezen door een programma op de server en het resultaat wordt uitgevoerd naar het HTML-document. Laten we eens kijken naar een voorbeeld:



Voorbeeld

include("zijbalk.htm" );
?>




Als we iets in de html-code van een pagina moeten invoegen, moeten we het include (insert) commando gebruiken. Vervolgens geven we het bestandsadres aan en de regeleinden, zoals in CSS;

HTML-code invoegen in webpagina's

In de regel zijn zijkolommen ( zijbalk) en kelder ( voettekst) blijven ongewijzigd op alle pagina's van de site. Daarom de codes

.....
En U kunt “sidebar.htm” en “footer.htm” in afzonderlijke htm-pagina’s plaatsen en deze in sitepagina’s invoegen met behulp van de opdracht include. Als we het tegelijkertijd meenemen apart bestand en de belangrijkste inhoud -
.....
, dan ziet de code van onze pagina er als volgt uit:



Voorbeeld

include("zijbalk.htm" );
include("inhoud.htm" );
include("voettekst.htm" );
?>




inhoud zijbalk.htm


Hier
inhoud
jouw
zijbalk

Hetzelfde geldt voor de bestanden content.htm en footer.htm.

Bij dit type paginageneratie hoeft u alleen maar wijzigingen aan te brengen in één bestand “sidebar.htm”, zodat alle pagina’s van de site veranderen. Dat is erg handig als uw site uit honderden of duizenden pagina's bestaat.

PHP op uw computer

Om met PHP-scripts te kunnen werken en de uitvoeringsresultaten in een browser te kunnen bekijken, moet u een werkende webserver met PHP op uw lokale computer installeren.
Denver is het meest geschikt voor dergelijke taken. (de officiële website biedt alles wat je nodig hebt gratis) De installatiekit bevat - Apache, php en MySQL. Met andere woorden, uw computer heeft een volledig functionele server voor websitehosting.

Om PHP-code op HTML-pagina's te laten werken, moet u het bestand openen .htaccess in welke dan ook teksteditor en schrijf het volgende:

AddHandler-applicatie/x-httpd-php .html

Deze invoer maakt uitvoering mogelijk PHP-scripts op HTML-pagina's.

Of verander de bestandsextensie. html op. php

PHP-functies

PHP kan meer dan alleen HTML weergeven. PHP-functies omvatten beeldvorming, PDF-bestanden en zelfs Flash-films (met behulp van libswf en Ming) die direct worden gemaakt. PHP kan ook tekstgegevens produceren, zoals XHTML en andere XML-bestanden. PHP kan dergelijke bestanden automatisch genereren en opslaan bestandssysteem uw server, in plaats van deze aan de client te geven, waardoor een cache met dynamische inhoud aan de serverzijde wordt georganiseerd.

Een van de belangrijkste voordelen van PHP is de ondersteuning voor een breed scala aan databases.

Kortom, PHP heeft je veel te bieden! Meer informatie over de voordelen van PHP kunt u vinden op www.php.su.

1 februari 2015 Van de auteur:

PHP of HTML – wat is beter? Stel nooit zo’n vraag aan een professional. Ten eerste ‘val’ je in zijn ogen meteen naar het niveau van een complete ‘theepot’. En ten tweede... Zo'n vraag kan alleen voortkomen uit een compleet "theeservies". Welnu, dat betekent dat we vandaag een “theekransje” houden gewijd aan dit vreemde onderwerp.

Kip, ei: wie komt eerst?

Je moet niet met zulke ogen naar deze kop kijken. Geloof me, de kwestie van prioriteit tussen de hyperteksttaal ziet er voor mij ook een beetje eng uit. Waarom is dit zo? Welnu, omdat dit niet de eerste keer is dat we elkaar ontmoeten en ik hoop echt dat dergelijke vragen niet bij u opkomen. Maar we komen er in ieder geval wel uit!

Laten we eerst eens kijken wat een moderne website is. Om niet lange tijd "rond te sluipen", moet u meteen informatie inwinnen. Nu wordt elke webbron gemaakt met behulp van vier technologieën:

HTML – het wordt (zoals voorheen) gebruikt om pagina's in hun samenstellende elementen te markeren. CSS - verantwoordelijk voor verschijning

plaats. JavaScript – biedt UI-interactie ( gebruikersinterface

) met een persoon. PHP – biedt dynamische creatie

bronnen en alle daaruit voortvloeiende “gevolgen”: CMS, plug-ins ervoor, enz.

Ja, ik was MySQL bijna vergeten. Dit is een DBMS. Denk je dat ik een grapje maak? Niet echt! Het is alleen dat ons onderwerp zo "thee" is - hoe verschilt HTML van PHP. Voor deze vragen zou ik Ig Nobelprijzen uitreiken (er bestaan ​​zulke vragen).

Probeer een van de genoemde componenten van een moderne website weg te gooien en je krijgt geen dynamische hulpbron, maar een nauwelijks "weven" statische horror. Vooral als je ervan afkomt.

Verschillen in voorbeelden Er kunnen eindeloos mondelinge argumenten worden gegeven over de prioriteit en het verschil tussen de twee disciplines. Beter PHP-verschillen van HTML-parse naar specifieke voorbeelden

. Laten we eens kijken welke optie gemakkelijker is om de achtergrondkleur te wijzigen. Er is een zeer populaire engine genaamd WordPress. Het draait op PHP. Laten we ter vergelijking de opmaak van een gewone webpagina nemen en proberen deze te wijzigen achtergrondkleur

Om beter te begrijpen hoe HTML en PHP verschillen, probeert u in deze code de regel te vinden die de achtergrondkleur bepaalt. Laat me je meteen vertellen dat ze er niet is. Deze stijleigenschap (achtergrondkleur) moet worden opgegeven. Tegelijkertijd moet u weten waar u het moet toevoegen. En de hele site bestaat niet uit één pagina, maar uit tientallen.

Laten we nu hetzelfde doen via de administratie WordPress-paneel. Om dit te doen moeten we naar visuele redacteur pagina's en in gevestigd thema verander de overeenkomstige parameter door op meerdere knoppen te drukken.

In dit artikel ga ik je niet vertellen waarom websites nodig zijn en wat voor geld je ermee kunt verdienen. Hier wilde ik het alleen hebben over de verschillen tussen sites die met verschillende tools zijn gemaakt.

Overweeg een gewone HTML-website

Aan de ene kant nemen we een gewone HTML-site, die in wezen statisch is. Simpel gezegd: er zijn een bepaald aantal pagina's met informatie die met elkaar zijn verbonden door links. Meestal zijn er niet heel veel pagina's op zo'n site, hoewel er uitzonderingen zijn.


En er zijn maar weinig pagina's op dergelijke sites, want wanneer zo'n site begint te groeien, wordt het erg lastig om deze te beheren. Om deze reden stopt iemand helemaal met het monitoren van de site of probeert hij een soort contentmanagementsysteem (CMS) te gebruiken. Er zijn ook mensen die programmeertalen voor WEB proberen te leren om hun website geautomatiseerd en daardoor gemakkelijker te beheren te maken.

Maar zoals de ervaring leert, kunnen slechts enkelen deze taak aan, en hun sites blijven groeien en ontwikkelen.

Hoe zit het met alle anderen?

Sommige mensen surfen op internet, anderen proberen papieren boeken te kopen. Maar zonder basiskennis van de structuur van dergelijke programmeertalen, zonder de basisprincipes van het bouwen van websites te begrijpen, eindigen dergelijke pogingen meestal op niets.

Laten we aan de andere kant eens kijken naar een site die is gemaakt met een combinatie van gewone HTML- en eenvoudige taal programmeren voor web - PHP.

Het belangrijkste verschil tussen deze site en de vorige is dat zo'n site als constructor uit blokken kan worden gemaakt. We hebben een siteheader gemaakt - we hebben deze in een apart bestand geplaatst, we hebben een linkerblok gemaakt met sitenavigatie - we hebben deze in een apart bestand geplaatst, enz.

Wat levert dit ons op?

Het geeft je vrijheid. Die. Nu kunnen we deze blokken verbinden met het hoofdframework, en zelfs als we na verloop van tijd 10.000 pagina's op de site hebben en we plotseling een navigatie-element moeten veranderen, dan zal er niets ingewikkelds aan zijn. Het bestand geopend met het benodigde blok, bewerkt en dat is alles! Op alle 10.000 pagina's vond deze verandering in een oogwenk plaats.

Daarnaast allemaal nuttige informatie(artikelen, beschrijvingen van goederen en diensten, lessen, notities, enz.) van een dergelijke site kunnen worden opgeslagen in een database, die meer informatie geeft meer voordelen:

— De site neemt minder ruimte in beslag;
— Vereenvoudigd back-up gegevens;
— Het maakt het gemakkelijker om gegevens te wijzigen;
— Het wordt mogelijk om alle informatie te tellen (hoe vaak een pagina is bekeken, een bestand is gedownload, opmerkingen zijn toegevoegd, enz.);
— Je kunt er veel op de site gebruiken kant-en-klare PHP scripts;
- enz.

HTML of PHP

Als we een analogie trekken tussen HTML- en PHP-websites met auto's, dan net zoals moderne auto's comfortabeler, krachtiger en functioneler zijn geworden en tegelijkertijd minder brandstof begonnen te verbruiken dan hun tegenhangers van 50 jaar geleden, zo ook de PHP-website is lichter, functioneler, gemakkelijker te beheren en mobieler geworden dan zijn HTML-tegenstander.

Helaas is het onmogelijk om dit onderwerp volledig te behandelen in het kader van één artikel, maar ik denk dat je zelfs op basis van de punten die ik hier heb beschreven een conclusie kunt trekken over welke website je beter kunt maken om op de hoogte te blijven de tijd en krijg een fatsoenlijk rendement op de investering in de inspanningen voor het maken van sites.

Jevgeni Popov– Auteur van een 22,5 uur durende videocursus “Alle technische momenten van online zakendoen in videoformaat 2 of PHP + MySQL voor beginners”, waarin het hele proces met gesproken uitleg direct op het scherm van uw computer wordt weergegeven PHP-creatie site helemaal opnieuw.

U leert hoe u een lijst kunt krijgen van alle artikelen die op een site zijn gepubliceerd.

Stap 1. Voorbereiding

Allereerst moet u de bibliotheek kopiëren simpleHTMLdom, die beschikbaar is op de website

Het downloadarchief bevat meerdere bestanden, maar u heeft er maar één nodig simple_html_dom.php. Alle andere bestanden zijn voorbeelden en documentatie.

Stap 2: Basisprincipes van parseren

Deze bibliotheek is heel gemakkelijk te gebruiken, maar er zijn een paar basiszaken die u moet leren voordat u ermee aan de slag gaat.

$html = nieuwe simple_html_dom();
// Laden uit tekenreeks
$html->laden("

Hallo wereld!

");
// Bestand uploaden
$html->load_file("http://net.tutsplus.com/");

U kunt een bronobject maken door te laden HTML uit een string of uit een bestand. Laden vanuit een bestand kan worden gedaan door op te geven URL, of vanaf uw lokale bestandssysteem.

Opmerkingen: Methode laad_bestand() afgevaardigden werken PHP-functies file_get_contents. Als allow_url_fopen niet op waarde ingesteld WAAR in uw bestand php.ini, dan kan het zijn dat het niet mogelijk is om te openen verwijderde bestanden Dus. In dit geval kunt u terugkeren naar het gebruik van de CURL-bibliotheek om te laden verwijderde pagina's en lees vervolgens met behulp van de methode laden().

Toegang tot informatie

Zodra u een DOM-object heeft, kunt u ermee aan de slag gaan met behulp van de methode vinden() en het maken van collecties. Een verzameling is een groep objecten die door een selector wordt gevonden. De syntaxis lijkt sterk op jQuery.



Hallo wereld!


Wij zijn hier.






Hierin HTML-voorbeeld We gaan uitzoeken hoe we toegang kunnen krijgen tot de informatie in de tweede paragraaf, deze kunnen wijzigen en vervolgens het resultaat van de acties kunnen afdrukken.

1. # HTML maken en laden
2. include("simple_html_dom.php");
3. $html = nieuwe simple_html_dom();
4. $html->laden(“

Hallo wereld!



“);
5. # haal het element op dat de tweede alinea vertegenwoordigt
6. $element = $html->find(“p“);
7. # wijzig het
8. $element->innertext .= “en we zijn hier om te blijven.”;
9. # Uitvoer!
10. echo $html->opslaan();

Lijnen 2-4: Laad HTML uit een string zoals hierboven uitgelegd.

Lijn 6: Vind alle tags

In HTML, en stuur ze terug naar een array. De eerste alinea heeft index 0, en daaropvolgende alinea's worden dienovereenkomstig geïndexeerd.

Lijn 8: We hebben toegang tot het tweede element in onze paragraafverzameling (index 1) en voegen tekst toe aan het innertext-attribuut. Het innertext-attribuut vertegenwoordigt de inhoud tussen de tags, en het outsidetext-attribuut vertegenwoordigt de inhoud inclusief de tags. We kunnen de tag volledig vervangen met behulp van het buitenstetekstattribuut.

Laten we nu één regel toevoegen en de tag-klasse van onze tweede paragraaf wijzigen.

$element->class = "klasse_naam";
echo $html->opslaan();

De uiteindelijke HTML na het opslaancommando ziet er als volgt uit:



Hallo wereld!


We zijn hier en we zijn hier om te blijven.





Andere selecteurs

Nog een paar voorbeelden van selectors. Als je jQuery hebt gebruikt, zal alles je bekend voorkomen.

# haal het eerste gevonden element op met id=“foo“
$single = $html->find("#foo", 0);
# haal alle elementen op met klasse “foo“
$collection = $html->find(".foo");
# haal alle linktags op de pagina op
$collection = $html->find("a");
# haal alle linktags op die zich in de H1-tag bevinden
$collection = $html->find("h1 a");
# alles krijgen img-tags with title="himom"!}
$collection = $html->find("img");

Het eerste voorbeeld behoeft enige uitleg. Alle query's retourneren standaard verzamelingen, zelfs de ID-query, die slechts één element mag retourneren. Door echter de tweede parameter op te geven, zeggen we: “retourneer alleen het eerste element uit de verzameling.”

Dit betekent dat $enkel- een enkel element, en niet een array van elementen met één lid.

De overige voorbeelden liggen vrij voor de hand.

Documentatie

Volledige documentatie voor de bibliotheek is beschikbaar op .

Stap 3: Voorbeeld uit de echte wereld

Om de bibliotheek in actie te demonstreren, zullen we een script schrijven om de inhoud van de site net.tutsplus.com te schrappen en een lijst met titels en beschrijvingen te genereren van artikelen die op de site worden gepresenteerd..., gewoon als voorbeeld. Scrapen is een webtruc en mag niet worden gebruikt zonder toestemming van de eigenaar van de bron.

Include("simple_html_dom.php");
$artikelen = array();
get Articles("http://net.tutsplus.com/page/76/");

Laten we beginnen met het verbinden van de bibliotheek en het aanroepen van de functie getArtikelen waarmee de pagina wordt aangegeven van waaruit we willen beginnen met paren.

We zullen ook een globale array declareren om het gemakkelijker te maken om alle informatie over artikelen op één plek te verzamelen. Voordat we beginnen met parseren, kijken we eerst hoe het artikel op de Nettuts+ website wordt beschreven.



...


Titel




Beschrijving



Dit is het basisformaat van een bericht op de site, inclusief reacties. broncode. Waarom zijn opmerkingen belangrijk? Ze worden door de parser als knooppunten geteld.

Stap 4: Starten van de parseerfunctie

functie getArtikelen($page) (
globale $artikelen;
$html = nieuwe simple_html_dom();
$html->laad_bestand($page);
// ... Verder...
}

We beginnen met het declareren van een globale array, creëren nieuw voorwerp simple_html_dom en laad vervolgens de pagina voor parsering. Deze functie wordt recursief aangeroepen, dus stellen we de pagina-URL ervoor in als parameter.

Stap 5. Vind de informatie die we nodig hebben

1. $items = $html->find("div");
2. foreach($items als $post) (
3. # Vergeet niet om opmerkingen als knooppunten te tellen
4. $articles = array($post->children(3)->buitentekst,
5. $post->children(6)->first_child()->buitentekst);
6. }

Dit is de essentie van de functie getArtikelen. We moeten er dieper naar kijken om te begrijpen wat er gebeurt.

Lijn 1: Maak een array van elementen - tag div met de preview-klasse. We hebben nu een verzameling artikelen opgeslagen $artikelen.

Lijn 4: $ bericht verwijst nu naar een enkele div van de preview-klasse. Als we naar de originele HTML kijken, kunnen we zien dat het derde onderliggende element een tag is H1, die de titel van het artikel bevat. Wij nemen het en eigenen het toe $artikelen.

Vergeet niet om bij 0 te beginnen en rekening te houden met broncodeopmerkingen bij het bepalen van de juiste knooppuntindex.

Lijn 5: Zesde afstammeling $ bericht- Dit

. We hebben de beschrijvende tekst ervan nodig, dus gebruiken we buitentekst- de paragraaftag wordt opgenomen in de beschrijving. Een enkele vermelding in de array artikelen ziet er ongeveer zo uit:

$articles = “Artikeltitel”;
$articles = “Dit is mijn artikelbeschrijving“

Stap 6, Werken met pagina's

De eerste stap is bepalen hoe u de volgende pagina kunt vinden. Op de Nettuts+-site is het heel gemakkelijk om het paginanummer van de URL te raden, maar we moeten de link bij het parseren krijgen.

Als je naar de HTML kijkt, zul je het volgende vinden:

»

Dit is een link naar de volgende pagina en die kunnen we makkelijk per les vinden’ volgendepostslink’. Nu kan deze informatie worden gebruikt.

If($next = $html->find("a", 0)) (
$URL = $volgende->href;
$html->clear();
niet ingesteld($html);
getArtikel($URL);
}

In de eerste regel controleren we of we een referentie bij de klasse kunnen vinden volgendepostslink. Let op het gebruik van de tweede parameter in de functie vinden(). Op deze manier geven we aan dat we het eerste element (index 0) in de geretourneerde collectie willen krijgen. $volgende bevat één enkel element, geen verzameling.

Vervolgens wijzen we de HREF-link toe aan de $URL-variabele. Dit is belangrijk omdat we vervolgens het HTML-object verwijderen. Om geheugenlekken in php5 te voorkomen, moet het huidige object simple_html_dom moet worden gewist en uitgeschakeld voordat een ander object kan worden gemaakt. Als dit niet gebeurt, dan allemaal beschikbaar geheugen kan worden geabsorbeerd.

Ten slotte roepen we de functie get Articles aan met de URL volgende pagina. De recursie wordt afgebroken wanneer er geen pagina's meer zijn om te parseren.

Stap 7. Voer de resultaten uit

Eerst gaan we enkele basisstijlen installeren. Alles is volkomen willekeurig - u kunt installeren wat u wilt.

#voornaamst (
marge: 80px automatisch;
breedte:500px;
}
h1 (
lettertype: vet 40px/38px helvetica, verdana, schreefloos;
marge:0;
}
h1 een (
kleur:#600;
tekstversiering:geen;
}
P(
achtergrond: #ECECEC;
lettertype: 10px/14px verdana, schreefloos;
marge:8px 0 15px;
rand: 1px #CCC effen;
opvulling: 15px;
}
.item(
opvulling: 10px;
}

Vervolgens schrijven we een kleine PHP-functie op de pagina om de eerder opgeslagen informatie weer te geven.

foreach($artikelen als $item) (
echo "

";
echo $item;
echo $item;
echo "
";
}
?>

Het eindresultaat is een enkele HTML-pagina met alle artikelen van de Nettuts+-pagina's, te beginnen met het artikel dat is opgegeven in de eerste oproep getArtikelen().

Stap 8. Conclusie

Als je begint te parseren voor grote hoeveelheid pagina's (bijvoorbeeld de hele site), dan kan dit lang duren. Op een site als Nettuts+, die meer dan 86 pagina's heeft, kan het parseerproces meer dan een minuut duren.

Deze les opent het onderwerp voor u HTML-parsering. Er zijn andere DOM-manipulatietechnieken waarmee u met de xpath-selector kunt werken om elementen te vinden. Beschreven in deze les De bibliotheek is gemakkelijk te gebruiken en geweldig voor snel begin. Vergeet niet om toestemming te vragen voordat u een site scrapt.