פרק 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, אשר מחזירה את הטקסט בצורתו המקורית. רודפים אחרי תגים
|