[eeei.gr Logo]
Επικοινωνία
Ταυτότητα
Μαθήματα Internet | Μαθήματα Προγραμματισμού | Net Business | Τα νέα του Internet | Ο Κόσμος του Αύριο

Greed (Τραβώντας URLs από Web σελίδες)

Αν και υπάρχει ειδικό module για τη λήψη όλων των URLs μιας σελίδας (το HTML::LinkExtor), μερικές φορές προτιμούμε απλούστερες λύσεις είτε διότι τα modules δεν είναι πάντα διαθέσιμα στο σύστημα όπου εργαζόμαστε, είτε επειδή αυτό που θέλουμε να επιτύχουμε είναι αρκετά απλό και δεν υπάρχει λόγος να σκοτώνουμε τα ποντίκια με το κανόνι (small and simple is beautiful).

Στον κώδικα που ακολουθεί όλη η Web σελίδα βρίσκεται στην $content και επιθυμούμε να πάρουμε όλα τα URLs που ξεκινούν από ό,τι περιέχει η παράμετρος $start_url (π.χ. http://www.eeei.gr/interbiz).

while ($content =~ m/['"]($start_url(.*?))['"]/sig)

Η Perl θα βρει, δηλαδή θα κάνει match (m) ό,τι περικλείεται από τον χαρακτήρα ' ή " ['"], αρχίζει από $start_url και ακολουθείται από οτιδήποτε άλλο (.*?). Η αναζήτηση γίνεται γραμμή γραμμή (s) αν και αυτό δεν έχει σημασία αφού όλη η $content αποτελεί μια γραμμή, είναι case insensitive (i) και ισχύει για όλο το περιεχόμενο της $content, δηλαδή είναι global (g).

Για όσους έχουν απορία για το οτιδήποτε άλλο (.*?), αυτό μεταφράζεται ως ακολούθως:

. = οτιδήποτε (εκτός από αλλαγή γραμμής)

* = οσαδήποτε (από 0 έως όσο τύχει)

? = Σταμάτα στο πρώτο που θα βρεις

Για να καταλάβετε τη σημασία του ερωτηματικού δείτε την ακόλουθη περίπτωση:

<a href=http://www.eeei.gr/interbiz/articles/article1.htm"> ’ρθρο 1</a> μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα <a href=http://www.eeei.gr/interbiz/articles/article2.htm"> ’ρθρο 2</a>

Στο (.*)['"] δηλαδή ταίριαξε ό,τι μπορείς μέχρι το ' ή " η Perl θα μας φέρει το:

http://www.eeei.gr/interbiz/articles/article1.htm”> ’ρθρο 1</a> μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα <a href=http://www.eeei.gr/interbiz/articles/article2.htm

Δηλαδή δεν θα σταματήσει στο πρώτο “ που θα συναντήσει, αλλά στο τελευταίο. Τότε λέμε ότι η αναζήτηση είναι greedy (αχόρταγη). Το ? της ζητάει να κάνει δίαιτα και να ικανοποιηθεί με το πρώτο " που θα συναντήσει, οπότε το αποτέλεσμα θα είναι:

http://www.eeei.gr/interbiz/articles/article1.htm

{

my $basic_url_to_get = $1;

Παίρνουμε το περιεχόμενο του (.*?)

my @url_to_get = ($site_begin, $basic_url_to_get);

Στις περισσότερες web σελίδες τα URLs δεν είναι πλήρη. Για παράδειγμα, αν η σελίδα:

http://www.eeei.gr/interbiz/index.htm

παραπέμπει στο

http://www.eeei.gr/interbiz/articles/article1.htm

τότε ο κώδικας συνήθως θα είναι απλώς:

<a href="articles/article1.htm">’ρθρο 1</a>

Aν λοιπόν η $start_url ήταν articles/ τότε το $basic_url_to_get θα έχει τις τιμές:

articles/article1.htm

articles/article2.htm

articles/article7.htm

articles/newarticle.htm

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

my $site_begin = http://www.eeei.gr/interbiz/

Δημιουργούμε λοιπόν την array @url_to_get που περιέχει τα $site_begin και $basic_url_to_get.

my $complete_url_to_get = join ('', @url_to_get);

Με την join ενώνουμε αυτά τα δύο σε μια scalar με διαχωριστικό τίποτε. Έτσι τώρα η $complete_url_to_get θα έχει τιμές όπως:

http://www.eeei.gr/interbiz/ articles/article2.htm


Τρέχουσα Ενότητα: Perl


 

Φιλικά - συνεργαζόμενα sites: Left Handed Products


© Eeei.gr 2009