Γράφουμε έναν αναλυτή περιεχομένου στην PHP. Ανάλυση και επεξεργασία μιας ιστοσελίδας σε PHP: επιλογή της καλύτερης βιβλιοθήκης Πώς να αναλύσετε μια σελίδα html

Σελίδες ανάλυσης περιεχομένου PHP

Το άρθρο είναι αφιερωμένο στην ανάλυση, ειδικότερα στην ανάλυση ιστοτόπων, ανάλυση σελίδων, ανάλυση ιστού, ανάλυση περιεχομένου html ιστότοπου.

Κατά τη διαδικασία ανάπτυξης διαφόρων διαδικτυακών υπηρεσιών, πολύ συχνά συναντάμε εργασίες στις οποίες πρέπει να αποκτήσουμε γρήγορα διάφορα είδη πληροφοριών σε μεγάλους όγκους. Αυτό σχετίζεται κυρίως με αρπαγή, κλοπή πληροφοριών, όπως θέλετε πείτε το. Το θέμα είναι ότι οι πληροφορίες είναι προσβάσιμες και ανοιχτές. Η ιδιαιτερότητα της ανάλυσης είναι η γρήγορη και αυτοματοποιημένη συλλογή δεδομένων και περιεχομένου από ιστοσελίδες.

Σήμερα είναι πολύ δημοφιλές το scrape στο περιβάλλον web, δηλαδή το scrape σε έναν ιστότοπο που περιέχει τουλάχιστον κάποια αξία και συνάφεια για τους ανθρώπους. Ιδιαίτερη αξία έχει ο κατάλογος προϊόντων, που περιλαμβάνει εικόνες, βάσεις δεδομένων καταλόγου και πολλά άλλα που μπορεί να είναι χρήσιμα για τους ανταγωνιστές.

Ας προσπαθήσουμε να αναλύσουμε τις απαραίτητες πληροφορίες σε html, ας προσπαθήσουμε να πάρουμε όλους τους συνδέσμους από πολλές σελίδες του ιστότοπού μας.

Αρχικά, πρέπει να λάβουμε το περιεχόμενο του ιστότοπου σε μορφή html. Για να γίνει αυτό, πρέπει απλώς να γνωρίζουμε τις διευθύνσεις των απαραίτητων σελίδων.

Θέλω να δείξω 2 βασικούς τρόπους λήψης περιεχομένου από μια σελίδα ιστότοπου:

Πρώτα απ 'όλα, ας ετοιμάσουμε έναν πίνακα με τις απαραίτητες διευθύνσεις σελίδων:

//3 σύνδεσμοι προς τον ιστότοπό μας: $urls = array("http://hello-site..ru/games/");

Επιλογή 1 - συνάρτηση php file_get_contents. Η συνάρτηση επιστρέφει μια συμβολοσειρά html που θα αναλύσουμε σε συνδέσμους:

//βάλτε κάθε σύνδεσμο στη συνάρτηση file_get_contents foreach($urls ως $urlsItem)( $out .= file_get_contents($urlsItem); //και προσθέστε τα περιεχόμενα κάθε σελίδας στη γραμμή ) echo $out; //εδώ είναι το περιεχόμενο και των τριών σελίδων

Επιλογή 2 - CURL. Μια βιβλιοθήκη που υποστηρίζεται από php και έχει ένα μεγάλο σύνολο ρυθμίσεων, από αιτήματα POST έως εργασία με FTP. Ας εξετάσουμε μια τυπική κλήση στη βιβλιοθήκη curl, η οποία θα μας δώσει το περιεχόμενο του ιστότοπου:

foreach($urls ως $urlsItem)( //πέρασμα κάθε συνδέσμου σε βρόχο $output = curl_init(); //connect curl curl_setopt($output, CURLOPT_URL, $urlsItem); //στείλτε τη διεύθυνση της σελίδας curl_setopt($output, CURLOPT_RETURNTRANSFER, 1 curl_setopt ($output, CURLOPT_HEADER, 0).= curl_exec($output) //εδώ είναι το περιεχόμενο και των τριών σελίδων

Τώρα η γραμμή $out περιέχει το περιεχόμενο και των τριών σελίδων. Λοιπόν, ας πάμε απευθείας στην ανάλυση της συμβολοσειράς μας.

Και πάλι, θέλω να δείξω 3 επιλογές για την επίλυση του προβλήματός μας: τη μέθοδο "native" στην PHP, χρησιμοποιώντας την ενσωματωμένη βιβλιοθήκη DOMDocument και τη βιβλιοθήκη SimpleHTMLDOM.

1. Η συνάρτηση php εκρήγνυται. Η συνάρτηση βρίσκει τον αναζητούμενο χαρακτήρα ή μέρος μιας συμβολοσειράς και διαιρεί ολόκληρη τη συμβολοσειρά σε στοιχεία πίνακα.

Επαναλαμβάνω, πρέπει να λάβουμε τις τιμές όλων των ιδιοτήτων href των ετικετών a για αυτό θα διαιρέσουμε τη γενική συμβολοσειρά σε μερικά τμήματα\τμήματα:

// explode $hrefs = explode("

Αν εκτυπώσουμε τον πίνακα μας, θα μοιάζει κάπως έτσι:

Array ( => / => /hello => /timer/ => /leftmenu/ => /faq/ => /blog/ => /web-notes/ => /ordersite/ => /games)

2. ενσωματωμένη βιβλιοθήκη DOMDocument. Δουλεύουμε με την τάξη περίπου ως εξής:

//domelement $dom = νέο DODocument; //δημιουργία αντικειμένου $dom->loadHTML($out); //φόρτωση περιεχομένου $node = $dom->getElementsByTagName("a"); //πάρτε όλες τις ετικέτες a για ($i = 0; $i< $node->μήκος; $i++) ( $hrefText = $node->item($i)->getAttribute("href"); //λάβετε το χαρακτηριστικό href από την ετικέτα) foreach($hrefText ως $hrefTextItem)( //απαλλαγείτε από συνδέσμους με ένα κενό χαρακτηριστικό href if($hrefTextItem!="")( $clearHrefs=$hrefTextItem; ) ) $clearHrefs = array_unique($clearHrefs); //απαλλαγείτε από πανομοιότυπους συνδέσμους print_r($clearHrefs); // στο τέλος έχουμε έναν πίνακα με όλους τους συνδέσμους από 3 σελίδες

Το αποτέλεσμα αυτού του κώδικα είναι ακριβώς το ίδιο με τη χρήση της συνάρτησης explode.

3. Απλή HTMLDOM βιβλιοθήκη. Πρέπει να περιλαμβάνεται από αρχείο. Το έργο είναι περίπου παρόμοιο με το DOMDocument. Εργασία με την τάξη:

//simplehtml include("simple_html_dom.php"); //συμπεριλάβετε ένα αρχείο με την κλάση SimpleHTMLDOM $html = new simple_html_dom(); //δημιουργία αντικειμένου $html->load($out); //τοποθετήστε το περιεχόμενό μας $collection = $html->find("a"); //collect all tags a foreach($collection as $collectionItem) ( $articles = $collectionItem->attr; //πίνακας όλων των χαρακτηριστικών, href συμπεριλαμβανομένου ) foreach($articles as $articlesItem)( $hrefText = $articlesItem[ " href"]. )( $clearHrefs=$hrefTextItem; ) ) $clearHrefs = array_unique($clearHrefs); //απαλλαγείτε από πανομοιότυπους συνδέσμους print_r($clearHrefs); // στο τέλος έχουμε έναν πίνακα με όλους τους συνδέσμους από 3 σελίδες

Επαναλαμβάνω, το αποτέλεσμα στον πίνακα είναι ακριβώς το ίδιο με τα δύο παραπάνω.

Τώρα, έχοντας έναν πίνακα με όλους τους συνδέσμους που συλλέγονται από τρεις σελίδες του ιστότοπου, μπορείτε να στείλετε τους συνδέσμους στη σωστή κατεύθυνση, όλα εξαρτώνται από την εργασία και τη φαντασία. Έχοντας τέτοιες δυνατότητες, μπορείτε να αναλύσετε μεγάλο όγκο δεδομένων διαφόρων τύπων πληροφοριών, εικόνων, κειμένων, αρχείων καταγραφής κ.λπ. Οι πληροφορίες κάποιου άλλου βρίσκονται στα χέρια σας, πετάξτε τις όπως θέλετε, αλλά υπερασπιστείτε τον εαυτό σας, αν και αυτό είναι αδύνατο)

Το έργο της ανάλυσης και επεξεργασίας των απαραίτητων πληροφοριών από έναν ιστότοπο τρίτου μέρους αντιμετωπίζει έναν προγραμματιστή ιστού αρκετά συχνά και για διάφορους λόγους: με αυτόν τον τρόπο μπορείτε να γεμίσετε το έργο σας με περιεχόμενο, να φορτώσετε δυναμικά ορισμένες πληροφορίες κ.λπ.

Σε τέτοιες περιπτώσεις, ο προγραμματιστής έρχεται αντιμέτωπος με το ερώτημα: ποια από τις δεκάδες βιβλιοθήκες να επιλέξει; Σε αυτό το άρθρο, προσπαθήσαμε να εξετάσουμε τις πιο δημοφιλείς επιλογές και να επιλέξουμε την καλύτερη.

Κανονικές εκφράσεις

Παρόλο που τα "κανονικά" είναι το πρώτο πράγμα που έρχεται στο μυαλό, δεν πρέπει να τα χρησιμοποιείτε για πραγματικά έργα.

Ναι, οι τυπικές εκφράσεις κάνουν την καλύτερη δουλειά με απλές εργασίες, αλλά η χρήση τους γίνεται πολύ πιο δύσκολη όταν χρειάζεται να αναλύσετε ένα μεγάλο και πολύπλοκο κομμάτι κώδικα HTML, το οποίο, επιπλέον, δεν ταιριάζει πάντα με κάποιο συγκεκριμένο μοτίβο και μπορεί γενικά να περιέχει συντακτικά σφάλματα .

Αντί να «ολοκληρώνετε» την κανονική σας έκφραση με κάθε παραμικρή αλλαγή στον κώδικα, συνιστούμε να χρησιμοποιήσετε τα παρακάτω εργαλεία - είναι πιο απλό, πιο βολικό και πιο αξιόπιστο.

XPath και DOM

htmlSQL

Εάν δεν χρησιμοποιείτε PHP, μπορείτε να δείτε αυτήν τη σύντομη λίστα παρόμοιων εργαλείων για άλλες γλώσσες προγραμματισμού.

Τον τελευταίο καιρό εργάζομαι σε μια εταιρεία Radio City Sakhalin LLCστην ομάδα προγραμματιστών και δημοσιογράφων της πύλης ενημέρωσης και ψυχαγωγίας "Sitisakh". Ειδικά για τους λάτρεις του ποδοσφαίρου, η πύλη υποστηρίζει μια ενότητα "Αθλητισμός" με νέα από τον κόσμο του ποδοσφαίρου, βαθμολογίες και μια λίστα με παίκτες της ομάδας FC Sakhalin.

Η πύλη αυτή τη στιγμή βρίσκεται υπό επανασχεδιασμό, οπότε μου ανατέθηκε να χειριστώ την ενότητα "Αθλητισμός". Η κύρια λειτουργία μου στην ομάδα είναι η διάταξη νέων σχεδιαγραμμάτων. Μερικές φορές πρέπει να λύσουμε παράπλευρα προβλήματα για να διευκολύνουμε την ήδη δύσκολη δουλειά του κύριου προγραμματιστή μας. Σήμερα θα μιλήσω για το Microparser.

Προηγουμένως, οι πίνακες τουρνουά ποδοσφαίρου στην πύλη συμπληρώνονταν με μη αυτόματο τρόπο από τους διαχειριστές περιεχομένου. Υπάρχουν περιπτώσεις που τα αποτελέσματα των αγώνων εμφανίστηκαν στο Championship.com πιο γρήγορα από ότι στην πύλη μας. Τώρα αποφασίσαμε επιτέλους να κάνουμε αυτόματη ενημέρωση πίνακα. Δεδομένου ότι το Championship.com δεν παρέχει ένα API (τουλάχιστον κάποιο ανοιχτό) για τη λήψη των τραπεζιών τουρνουά που εμφανίζει, η μόνη επιλογή είναι η ανάλυση.

Πώς να χρησιμοποιήσετε το Microparser

Το "microparser" αποτελείται από μία μόνο συνάρτηση - parse_site(array $sites, array $defaults = array()) . Το πρώτο όρισμα είναι ένας πίνακας τοποθεσιών (ή σελίδων σε έναν ιστότοπο) που πρέπει να αναλυθούν και το δεύτερο είναι ένας πίνακας προεπιλεγμένων ρυθμίσεων.

Ο πίνακας $sites έχει την ακόλουθη μορφή:

Array("zona_vostok" => array("url" => "http://www.championat.com/football/_russia2d/589/table/all.html", "xpath" => "some/x/path" , //optional "xsl" => "absolute/path/to/xsl", //optional), "stackoverflow" => array("url" => "http://stackoverflow.com", "xpath" = > "some/x/path", "transform" => false //optional));

Όλα τα κλειδιά εκτός από το url είναι προαιρετικά. Εάν λείπει η έκφραση XPath, η σελίδα που καθορίζεται στην τιμή του κλειδιού url θα υποβληθεί σε επεξεργασία στο σύνολό της. Ένα φύλλο στυλ XSL μπορεί επίσης να συμπεριληφθεί μόνο εάν είναι απαραίτητη η επεξεργασία πρωτογενούς κώδικα.

Προσοχή στο "transform" => false key. Χρησιμοποιείται όταν ο πίνακας $defaults περιέχει το προεπιλεγμένο φύλλο στυλ XSL, αλλά ο μετασχηματισμός δεν είναι απαραίτητος για τη δεδομένη σελίδα.

Ο πίνακας $defaults αποφεύγει την αντιγραφή ρυθμίσεων στον πίνακα $sites. Μπορεί να περιέχει μόνο δύο κλειδιά: xpath και xsl. Άλλα κλειδιά απλά αγνοούνται.

Περίληψη

Ο αναλυτής που έγραψα αποτελείται από μία συνάρτηση με δύο παραμέτρους (για ιδιωτικές και γενικές ρυθμίσεις), σας επιτρέπει να φορτώσετε ολόκληρη τη σελίδα ή ένα ξεχωριστό τμήμα της και επίσης, εάν θέλετε, να επεξεργαστείτε το αποτέλεσμα με ένα φύλλο στυλ XSL.

Στην αρχή, ήθελα να χρησιμοποιήσω μια βιβλιοθήκη όπως το phpQuery ή το Ganon για να διασχίσω κόμβους, αλλά μετά σκέφτηκα προσεκτικά και συνειδητοποίησα ότι δεν υπήρχε νόημα να σύρω επιπλέον εξαρτήσεις - θα μπορούσατε να χρησιμοποιήσετε το ήδη υπάρχον, ενσωματωμένο εργαλείο.

Παράδειγμα εργασίας

Ας δούμε τη βαθμολογία του ρωσικού πρωταθλήματος ποδοσφαίρου στη δεύτερη κατηγορία, ζώνη «Ανατολή».

Εφόσον πρέπει να "τραβήξουμε" τον πίνακα του τουρνουά απευθείας από τη σελίδα, η έκφραση XPath θα είναι η εξής: //div[@id="section-statistics"]/table

Ο πίνακας πηγής περιέχει πολλά σκουπίδια: χαρακτηριστικά, κλάσεις, ενσωματωμένα στυλ. Έτσι, θα του δώσουμε μια πιο ωραία εμφάνιση χρησιμοποιώντας ένα φύλλο στυλ XSL με το ακόλουθο περιεχόμενο:

Ομάδα Παιχνίδια Νίκη Ισοπαλίες Απώλειες Μπάλες Γυαλιά
ακόμη και Περιττός

Τώρα ας γράψουμε τον κωδικό για να εμφανιστεί ο τελικός πίνακας τουρνουά.

$results = parse_site(array("zona_vostok" => array("url" => "http://www.championat.com/football/_russia2d/589/table/all.html", "xpath" => "xpath " => "//div[@id="section-statistics"]/table", "xsl" => __DIR__."/football.xsl")); εκτύπωση $results["zona_vostok"];

Και η έξοδος είναι ο ακόλουθος κώδικας HTML:

...
Ομάδα Παιχνίδια Νίκη Ισοπαλίες Απώλειες Μπάλες Γυαλιά
1 Luch-Energy 20 12 6 2 30-17 42
2 Τσίτα 20 12 5 3 28-14 41

Κατεβάστε το "Microparser"

Ακολουθούν μερικοί τρόποι για να πάρετε τα χέρια σας στο Microparser:

  1. Fork στο Github: git clone https://github.com/franzose/microparser.git
  2. Κατεβάστε το αρχείο:

Πολλοί από εσάς έχετε ερωτήσεις σχετικά δημιουργία ενός αναλυτή στην PHP. Για παράδειγμα, υπάρχει ένας ιστότοπος και πρέπει να λαμβάνετε περιεχόμενο από αυτόν. Δεν ήθελα να γράψω αυτό το άρθρο για πολύ καιρό, γιατί δεν υπάρχει συγκεκριμένο νόημα σε αυτό. Προς την φτιάξτε έναν αναλυτή στην PHP, πρέπει να γνωρίζετε αυτή τη γλώσσα. Και όσοι τον γνωρίζουν απλά δεν θα κάνουν μια τέτοια ερώτηση. Αλλά σε αυτό το άρθρο θα σας πω πώς δημιουργούνται γενικά οι αναλυτές, καθώς και τι πρέπει να μελετηθεί συγκεκριμένα.

Λοιπόν, εδώ είναι μια λίστα με σημεία που πρέπει να περάσετε για να το κάνετε δημιουργήστε έναν αναλυτή περιεχομένου στην PHP:

  1. Λάβετε τα περιεχόμενα της σελίδας και γράψτε τα σε μια μεταβλητή συμβολοσειράς. Η απλούστερη επιλογή είναι η λειτουργία file_get_contents(). Εάν το περιεχόμενο είναι διαθέσιμο μόνο σε εξουσιοδοτημένους χρήστες, τότε όλα είναι κάπως πιο περίπλοκα. Εδώ πρέπει να δούμε ποιος είναι ο μηχανισμός εξουσιοδότησης. Στη συνέχεια, χρησιμοποιώντας μπούκλα, στείλτε το σωστό αίτημα στη φόρμα εξουσιοδότησης, λάβετε μια απάντηση και, στη συνέχεια, στείλτε τις σωστές κεφαλίδες (για παράδειγμα, το ληφθέν αναγνωριστικό περιόδου σύνδεσης) και επίσης στο ίδιο αίτημα αποκτήστε πρόσβαση στη σελίδα που χρειάζεστε. Στη συνέχεια, σε αυτήν την απάντηση θα λάβετε την τελική σελίδα.
  2. Μελετήστε τη δομή της σελίδας. Πρέπει να βρείτε το περιεχόμενο που χρειάζεστε και να δείτε σε ποιο μπλοκ βρίσκεται. Εάν το μπλοκ στο οποίο βρίσκεται δεν είναι μοναδικό, τότε βρείτε άλλα κοινά χαρακτηριστικά με τα οποία μπορείτε σίγουρα να πείτε ότι εάν η γραμμή τα ικανοποιεί, τότε αυτό είναι που χρειάζεστε.
  3. Χρησιμοποιώντας συναρτήσεις συμβολοσειράς, εξάγετε το περιεχόμενο που χρειάζεστε από τη συμβολοσειρά προέλευσης με βάση τα χαρακτηριστικά που βρίσκονται 2οσημείο.

Θα σημειώσω επίσης ότι μόνο όσοι γνωρίζουν θα τα καταλάβουν όλα αυτά και θα μπορέσουν να τα εφαρμόσουν στην πράξη PHP. Επομένως, για όσους μόλις αρχίζουν να το μελετούν, θα χρειαστείτε τις ακόλουθες γνώσεις:

  1. Συναρτήσεις συμβολοσειράς.
  2. Βιβλιοθήκη μπούκλα, ή το ανάλογό του.
  3. Άριστη γνώση HTML.

Αυτοί που ακόμα δεν ξέρουν καθόλου PHP, τότε οι αναλυτές σε αυτήν την περίπτωση είναι ακόμα μακριά και πρέπει να μελετήσετε ολόκληρη τη βάση δεδομένων. Θα σας βοηθήσει με αυτό

Θα μάθετε πώς να λαμβάνετε μια λίστα με όλα τα άρθρα που δημοσιεύονται σε έναν ιστότοπο.

Βήμα 1. Προετοιμασία

Πρώτα απ 'όλα πρέπει να αντιγράψετε τη βιβλιοθήκη απλό HTMLdom, το οποίο είναι διαθέσιμο στον ιστότοπο

Το αρχείο λήψης περιέχει πολλά αρχεία, αλλά χρειάζεστε μόνο ένα simple_html_dom.php. Όλα τα άλλα αρχεία είναι παραδείγματα και τεκμηρίωση.

Βήμα 2: Βασικά στοιχεία ανάλυσης

Αυτή η βιβλιοθήκη είναι πολύ εύκολη στη χρήση, αλλά υπάρχουν μερικά βασικά πράγματα που πρέπει να μάθετε πριν τη θέσετε σε λειτουργία.

$html = new simple_html_dom();
// Φόρτωση από συμβολοσειρά
$html->load("

Γειά σου Κόσμε!

");
// Ανέβασμα αρχείου
$html->load_file("http://net.tutsplus.com/");

Μπορείτε να δημιουργήσετε ένα αντικείμενο προέλευσης με φόρτωση HTMLείτε από συμβολοσειρά είτε από αρχείο. Η φόρτωση από ένα αρχείο μπορεί να γίνει είτε με τον καθορισμό URL, ή από το τοπικό σας σύστημα αρχείων.

Σημειώσεις: Μέθοδος load_file()αναθέτει εργασία σε μια συνάρτηση PHP file_get_contents. Αν allow_url_fopenδεν έχει οριστεί σε τιμή αληθήςστο αρχείο σας php.ini, τότε ενδέχεται να μην μπορείτε να ανοίξετε απομακρυσμένα αρχεία με αυτόν τον τρόπο. Σε αυτήν την περίπτωση, μπορείτε να επιστρέψετε στη χρήση της βιβλιοθήκης CURL για τη φόρτωση απομακρυσμένων σελίδων και στη συνέχεια να διαβάσετε χρησιμοποιώντας τη μέθοδο φορτώνω().

Πρόσβαση στις πληροφορίες

Μόλις έχετε ένα αντικείμενο DOM, μπορείτε να ξεκινήσετε να εργάζεστε με αυτό χρησιμοποιώντας τη μέθοδο εύρημα()και δημιουργία συλλογών. Μια συλλογή είναι μια ομάδα αντικειμένων που βρίσκονται από έναν επιλογέα. Η σύνταξη μοιάζει πολύ με το jQuery.



Γειά σου Κόσμε!


Ήταν εδώ.






Σε αυτό το παράδειγμα HTML, θα μάθουμε πώς να αποκτήσουμε πρόσβαση στις πληροφορίες της δεύτερης παραγράφου, να τις αλλάξουμε και, στη συνέχεια, να εκτυπώσουμε το αποτέλεσμα των ενεργειών.

1. # δημιουργία και φόρτωση HTML
2. include("simple_html_dom.php");
3. $html = new simple_html_dom();
4. $html->load(“

Γειά σου Κόσμε!



“);
5. # λάβετε το στοιχείο που αντιπροσωπεύει τη δεύτερη παράγραφο
6. $element = $html->find(“p“);
7. # τροποποιήστε το
8. $element->innertext .= “ και είμαστε εδώ για να μείνουμε.“;
9. # Έξοδος!
10. echo $html->save();

Γραμμές 2-4: Φόρτωση HTML από μια συμβολοσειρά όπως εξηγήθηκε παραπάνω.

Γραμμή 6: Βρείτε όλες τις ετικέτες

Σε HTML και επιστρέψτε τα σε έναν πίνακα. Η πρώτη παράγραφος θα έχει δείκτη 0 και οι επόμενες παράγραφοι θα ευρετηριαστούν ανάλογα.

Γραμμή 8: Έχουμε πρόσβαση στο δεύτερο στοιχείο στη συλλογή παραγράφων μας (ευρετήριο 1), προσθέτοντας κείμενο στο χαρακτηριστικό του εσωτερικού κειμένου. Το χαρακτηριστικό innertext αντιπροσωπεύει το περιεχόμενο μεταξύ των ετικετών και το χαρακτηριστικό outertext αντιπροσωπεύει το περιεχόμενο συμπεριλαμβανομένων των ετικετών. Μπορούμε να αντικαταστήσουμε πλήρως την ετικέτα χρησιμοποιώντας το χαρακτηριστικό outertext.

Τώρα ας προσθέσουμε μία γραμμή και ας τροποποιήσουμε την κλάση ετικετών της δεύτερης παραγράφου μας.

$element->class = "class_name";
echo $html->save();

Το τελικό HTML μετά την εντολή αποθήκευσης θα μοιάζει με αυτό:



Γειά σου Κόσμε!


Είμαστε εδώ και είμαστε εδώ για να μείνουμε.





Άλλοι επιλογείς

Μερικά άλλα παραδείγματα επιλογέων. Εάν έχετε χρησιμοποιήσει jQuery, όλα θα σας φαίνονται οικεία.

# λάβετε το πρώτο στοιχείο που βρέθηκε με id=“foo”
$single = $html->find("#foo", 0);
# λάβετε όλα τα στοιχεία με την κλάση "foo"
$collection = $html->find(".foo");
# λάβετε όλες τις ετικέτες συνδέσμων στη σελίδα
$collection = $html->find("a");
# λάβετε όλες τις ετικέτες συνδέσμων που βρίσκονται μέσα στην ετικέτα H1
$collection = $html->find("h1 a");
# λάβετε όλες τις ετικέτες img με title="himom"!}
$collection = $html->find("img");

Το πρώτο παράδειγμα απαιτεί κάποια εξήγηση. Όλα τα ερωτήματα επιστρέφουν συλλογές από προεπιλογή, ακόμη και το ερώτημα ID, το οποίο θα πρέπει να επιστρέφει μόνο ένα στοιχείο. Ωστόσο, καθορίζοντας τη δεύτερη παράμετρο, λέμε "επιστροφή μόνο του πρώτου στοιχείου από τη συλλογή".

Αυτό σημαίνει ότι $μονό- ένα μόνο στοιχείο και όχι μια σειρά στοιχείων με ένα μέλος.

Τα υπόλοιπα παραδείγματα είναι αρκετά προφανή.

Τεκμηρίωση

Η πλήρης τεκμηρίωση για τη βιβλιοθήκη είναι διαθέσιμη στη διεύθυνση .

Βήμα 3: Παράδειγμα πραγματικού κόσμου

Για να δείξουμε τη βιβλιοθήκη σε δράση, θα γράψουμε ένα σενάριο για να σκουπίσουμε τα περιεχόμενα του ιστότοπου net.tutsplus.com και να δημιουργήσουμε μια λίστα με τίτλους και περιγραφές άρθρων που παρουσιάζονται στον ιστότοπο... απλώς ως παράδειγμα. Η απόξεση είναι ένα τέχνασμα ιστού και δεν πρέπει να χρησιμοποιείται χωρίς άδεια από τον ιδιοκτήτη του πόρου.

Include("simple_html_dom.php");
$articles = array();
getArticles("http://net.tutsplus.com/page/76/");

Ας ξεκινήσουμε συνδέοντας τη βιβλιοθήκη και καλώντας τη συνάρτηση getArticlesυποδεικνύοντας τη σελίδα από την οποία θέλουμε να ξεκινήσουμε την ανάλυση.

Θα δηλώσουμε επίσης έναν παγκόσμιο πίνακα για να διευκολύνουμε τη συλλογή όλων των πληροφοριών σχετικά με άρθρα σε ένα μέρος. Πριν ξεκινήσουμε την ανάλυση, ας ρίξουμε μια ματιά στο πώς περιγράφεται το άρθρο στον ιστότοπο Nettuts+.



...


Τίτλος




Περιγραφή



Αυτή είναι η βασική μορφή μιας ανάρτησης στον ιστότοπο, συμπεριλαμβανομένων των σχολίων στον πηγαίο κώδικα. Γιατί είναι σημαντικά τα σχόλια; Καταμετρώνται από τον αναλυτή ως κόμβοι.

Βήμα 4: Ξεκινήστε τη συνάρτηση ανάλυσης

συνάρτηση getArticles($page) (
παγκόσμια $articles;
$html = new simple_html_dom();
$html->load_file($page);
// ... Περαιτέρω...
}

Ξεκινάμε δηλώνοντας έναν καθολικό πίνακα, δημιουργώντας ένα νέο αντικείμενο simple_html_domκαι, στη συνέχεια, φορτώστε τη σελίδα για ανάλυση. Αυτή η συνάρτηση θα καλείται αναδρομικά, επομένως ορίσαμε τη διεύθυνση URL της σελίδας ως παράμετρο για αυτήν.

Βήμα 5. Βρείτε τις πληροφορίες που χρειαζόμαστε

1. $items = $html->find("div");
2. foreach($items as $post) (
3. # θυμηθείτε να μετράτε τα σχόλια ως κόμβους
4. $articles = array($post->children(3)->outertext,
5. $post->children(6)->first_child()->outertext);
6. }

Αυτή είναι η ουσία της λειτουργίας getArticles. Πρέπει να το εξετάσουμε λεπτομερέστερα για να καταλάβουμε τι συμβαίνει.

Γραμμή 1: Δημιουργήστε έναν πίνακα στοιχείων - ετικέτα divμε την τάξη προεπισκόπησης. Τώρα έχουμε αποθηκευμένη μια συλλογή άρθρων $στοιχεία.

Γραμμή 4: $postτώρα αναφέρεται σε ένα μεμονωμένο div της κατηγορίας προεπισκόπησης. Αν κοιτάξουμε τον αρχικό κώδικα HTML, μπορούμε να δούμε ότι το τρίτο στοιχείο απόγονος είναι μια ετικέτα H1, που περιέχει τον τίτλο του άρθρου. Το παίρνουμε και το οικειοποιούμε $άρθρα.

Θυμηθείτε να ξεκινήσετε από το 0 και να λάβετε υπόψη τα σχόλια του πηγαίου κώδικα κατά τον προσδιορισμό του σωστού ευρετηρίου κόμβου.

Γραμμή 5: Έκτος απόγονος $post- Αυτό

. Χρειαζόμαστε το κείμενο περιγραφής από αυτό, γι' αυτό χρησιμοποιούμε εξωτερικό κείμενο- η ετικέτα παραγράφου θα περιλαμβάνεται στην περιγραφή. Μια μεμονωμένη καταχώρηση στον πίνακα άρθρων θα μοιάζει κάπως έτσι:

$articles = "Τίτλος άρθρου";
$articles = "Αυτή είναι η περιγραφή του άρθρου μου"

Βήμα 6, Εργασία με σελίδες

Το πρώτο βήμα είναι να καθορίσετε πώς θα βρείτε την επόμενη σελίδα. Στον ιστότοπο Nettuts+ είναι πολύ εύκολο να μαντέψουμε τον αριθμό της σελίδας από τη διεύθυνση URL, αλλά πρέπει να λάβουμε τον σύνδεσμο σε ανάλυση.

Αν κοιτάξετε την HTML, θα βρείτε τα εξής:

»

Αυτός είναι ένας σύνδεσμος προς την επόμενη σελίδα και μπορούμε εύκολα να τον βρούμε ανά τάξη " nextpostslink’. Τώρα αυτές οι πληροφορίες μπορούν να χρησιμοποιηθούν.

If($next = $html->find("a", 0)) (
$URL = $next->href;
$html->clear();
unset($html);
getArticles($URL);
}

Στην πρώτη γραμμή ελέγχουμε αν μπορούμε να βρούμε αναφορά με την κλάση nextpostslink. Σημειώστε τη χρήση της δεύτερης παραμέτρου στη συνάρτηση εύρημα(). Με αυτόν τον τρόπο υποδεικνύουμε ότι θέλουμε να λάβουμε το πρώτο στοιχείο (ευρετήριο 0) στην επιστρεφόμενη συλλογή. $επόμενοπεριέχει ένα μόνο στοιχείο, όχι μια συλλογή.

Στη συνέχεια εκχωρούμε τον σύνδεσμο HREF στη μεταβλητή $URL. Αυτό είναι σημαντικό γιατί στη συνέχεια αφαιρούμε το αντικείμενο HTML. Για να αποτρέψετε τη διαρροή μνήμης στο php5, το τρέχον αντικείμενο simple_html_domπρέπει να διαγραφεί και να καταργηθεί πριν δημιουργηθεί άλλο αντικείμενο. Εάν αυτό δεν γίνει, τότε όλη η διαθέσιμη μνήμη μπορεί να καταναλωθεί.

Τέλος, καλούμε τη συνάρτηση getArticles με τη διεύθυνση URL της επόμενης σελίδας. Η αναδρομή διακόπτεται όταν δεν απομένουν σελίδες για ανάλυση.

Βήμα 7. Εξαγωγή των αποτελεσμάτων

Αρχικά, θα εγκαταστήσουμε μερικά βασικά στυλ. Όλα είναι εντελώς αυθαίρετα - μπορείτε να εγκαταστήσετε αυτό που σας αρέσει.

#κύριος (
περιθώριο: 80 px auto;
πλάτος: 500 px;
}
h1 (
γραμματοσειρά: έντονη 40px/38px helvetica, verdana, sans-serif;
περιθώριο: 0;
}
h1 a (
χρώμα:#600;
κείμενο-διακόσμηση:κανένα;
}
Π(
φόντο: #ECECEC;
γραμματοσειρά:10px/14px verdana, sans-serif;
περιθώριο: 8 px 0 15 px;
περίγραμμα: 1px #CCC στερεό;
padding: 15px;
}
.είδος(
padding: 10px;
}

Στη συνέχεια γράφουμε μια μικρή συνάρτηση PHP στη σελίδα για να εμφανίσουμε τις προηγουμένως αποθηκευμένες πληροφορίες.

foreach($articles as $item) (
ηχώ "

";
echo $item;
echo $item;
ηχώ "
";
}
?>

Το τελικό αποτέλεσμα είναι μια ενιαία σελίδα HTML που περιλαμβάνει όλα τα άρθρα από τις σελίδες Nettuts+, ξεκινώντας με αυτό που καθορίζεται στην πρώτη κλήση getArticles().

Βήμα 8. Συμπέρασμα

Εάν αρχίσετε να κάνετε ξύσιμο για μεγάλο αριθμό σελίδων (ας πούμε, ολόκληρο τον ιστότοπο), τότε αυτό μπορεί να πάρει πολύ χρόνο. Σε έναν ιστότοπο όπως το Nettuts+, ο οποίος έχει περισσότερες από 86 σελίδες, η διαδικασία ανάλυσης μπορεί να διαρκέσει περισσότερο από ένα λεπτό.

Αυτό το μάθημα σας εισάγει στο θέμα της ανάλυσης HTML. Υπάρχουν άλλες τεχνικές χειρισμού DOM που σας επιτρέπουν να εργαστείτε με τον επιλογέα xpath για να βρείτε στοιχεία. Η βιβλιοθήκη που περιγράφεται σε αυτό το σεμινάριο είναι εύκολη στη χρήση και ιδανική για να ξεκινήσετε γρήγορα. Θυμηθείτε να ζητήσετε άδεια πριν από την απόξεση ενός ιστότοπου.





Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: