logo


פרק 5: עיבוד וניתוח של עמודי רשת

שליפת תגיות בלי מאמץ: TokeParser

קריאת הטמפרטורה המעודכנת מהאתר של Weather Underground היתה קלה יחסית. הקלות נבעה בחלקה מהעובדה שהיינו צריכים לקרוא קטע טקסט אחד בלבד, וכן מהעובדה שהטקסט היה קל לאיתור בתוך תגי הערות של HTML. ברגע זה אנו מתפוצצים מרוב גאווה עצמית ושאיפותינו נוסקות לגבהים חדשים...

פעולת האנליזה של מסמך HTML (או כל מסמך אחר), והניסיון להפקת מידע מאותו מסמך, נקרא בלשון המתכנתים - ניתוח (parsing). במילים פשוטות, אנו מנתחים את העמוד של Weather Underground לאיתור תג ההערה של הטמפרטורה הנוכחית. למרות זאת ניתוח יכול להיות פעולה מסובכת למדי. ראשית, כדי לנתח את מסמך יש צורך להבין את המבנה שלו - למשל מסמך HTML בנוי בעזרת חוקי סימון אשר שהוגדרו (inherent) במסמך הסטנדרטים של הHTML .

אולם תודה לאל, סידרה זה נקראת "ה Perl שאתם צריכים לדעת", ואתם לא צריכים לדעת את כל זה. כל מה שאתם צריכים לדעת, הוא את מודול ה HTML::TokeParser Perl (נובע מהמונח Token Parser - ניתוח תגים). בעזרת מודול זה אנו יכולים לכתוב סקריפטים אשר ינברו בכל עמוד HTML לאורך ולרוחב, וישלפו ממנו רק את המידע בו אנו מעוניינים. בעזרתו, ניצור מנתח עמודי רשת שיבנה סיכום קוד של עמוד נתון.

TokeParser אינו מושלם, אולם הוא פשוט ביותר יחסית למנתח (parser) מורכב, וזו תכונה חיובית. כרגיל, אנו חייבים לכלול את מודול ה TokeParser:HTML בראש סקריפט ה Perl שלנו.

#!/usr/bin/perl
use CGI;
use LWP::Simple;
use HTML::TokeParser;

עתה, כאשר TokeParser כבר רעב לקוד, נהיה חייבים להאכיל אותו. הדרך הפשוטה ביותר לשלוח קוד מקור לתוך TokeParser הוא ע"י שליחת עמוד רשת לתוך משתנה מקומי, כמו שראינו בדוגמה הקודמת.

#retrieve web page
$fetchURL=$cgiobject->param("url");
unless ($fetchURL) 
 {$fetchURL=""}
$webPage=get($fetchURL);

קטע קוד זה תר אחר הפרמטר "url" המסופק ע"י שליחת טופס (form submission) [שנראה בעתיד], אולם אם אין פרמטר כזה, הוא מקבל כברירת מחדל את הURL של העמוד הנוכחי. לאחר מכן הוא מנצל את מודול ה LWP::Simple שלמדנו לאהוב, ומחזיר את העמוד המטופל לתוך המשתנה webpage$.

התשתית הוכנה...הגיע הזמן לנתח. אבל לנתח מה? ובכן אנו יכולים לנתח כל תג HTML ממניעים רבים, הבא נתבונן בדוגמא הבאה: כותרת העמוד הזה. מובן שתג הHTML: <TITLE> תוחם את כותרת המאמר, ולכן נוכל לבצע ניתוח של העמוד ושליפת הכותרת.

sub parse_title{
#parse and output page title
$parser=HTML::TokeParser->new(\$webPage);
$parser->get_tag("title");
print "<p><h2>Page title</h2> ".
      $parser->get_trimmed_text."</p>";
}

התחלנו ביצירת מופע חדש של האובייקט TokeParser, מה שגורם למנתח להתחיל לנתח בתחילת המסמך הנתון. שימו לב ש ()new צריך לקבל פרמטר המכיל הפניה למשתנה המכיל בתוכו את קוד ה HTML של המסמך. ההפניה (reference) מסומנת באמצעות הקו הנטוי (\), ומתפקדת, בעצם, כמצביע למשתנה המצויין. לחלופין, במידה והיינו משתמשים במשתנה, בלא ציון ההפניה ( (new($webPage <-) , ה TokeParser היה חושב שהכוונה ב webPage$ היא למזהה קובץ (file handle) המקושר לקובץ מקומי פתוח, הנמצא על הדיסק הקשיח שלנו, וכמו שאתם מבינים, זוהי אינה כוונתנו.

הקריאה למתודת ה ()get_tag של ה TokeParser מציינת איזה תג לתפוס. TokeParser תתפוס את המופע הראשון של התג <TITLE> ולאחר מכן תמשיך בתוכנת ה Perl כמקודם (טוב, מה כבר רציתם שהיא תעשה, תדפוק על הדלת ותגיד "מה עושים עכשיו?").

לסיכום, אנו מוציאים את הטקסט של התג אשר מתחבא בתוך קודHTML. מתודת ה ()get_trimmed_text של ה TokeParser שולחת את הטקסט של התג (במקרה שלנו את כותרת העמוד), תוך כדי מחיקת רווחים מיותרים. דרך אחרת היא להחזיר את הטקסט באמצעות מתודת ה ()get_text, אשר מחזירה את הטקסט בצורתו המקורית.

רודפים אחרי תגים
תוכן עניינים
ניתוח תכונות בקלות

אודות
תוכן עניינים
פרק 1: ה Perl שאתם צריכים לדעת
פרק 2: קישור Perl לעמודי הרשת
פרק 3: שמירת מצב
פרק 4: HTML בחטף ותבניות (Templates) רשת
פרק 5: עיבוד וניתוח של עמודי רשת
מטרה פשוטה: קוד כמו שסבתא נהגה להכין  
פשוט, LWP:Simple  
רודפים אחרי תגים  
שליפת תגיות בלי מאמץ: TokeParser  
ניתוח תכונות בקלות  
השיטה היא לנתח: מסכם עמודי רשת  
פרק 6: להשתעשע עם בסיסי נתונים מקוונים:אקסס
פרק 7: המודל MySQL
פרק 8: להשתעשע בבסיסי נתונים - GUFE - החזית הכללית והשימושית
פרק 9: המילניום - ניהול זמן ותאריך
פרק 10: ניהול רשימות והאשים (Hashs)
פרק 11: הפניה להפניה
פרק 12: הכרות עם mod_perl