יום ראשון, 10 ביולי 2011

PHP וחילוץ נתונים מתוך HTML

במקרים רבים (ואנשים רבים שואלים אותי) אנחנו צריכים לחלץ נתונים מאתרי אינטרנט ודפי HTML.
מהי הדרך הטובה ביותר לעשות זאת? ומהי הדרך הנוחה ביותר לעשות זאת?

כמובן שאם האתר מספק לנו נתונים באמצעות XML או באופן מדוייק יותר RSS הפתרון הוא קל יחסית, ושימוש ביכולות המובנות של PHP לניתוח XML/RSS באות לעזרתנו. לדוגמא, simple_xml_loadfile.

אך מה קורה אם אין אפשרות לגשת לאתר לקבלת מידע בפורמטים מקובלים כמו XML/RSS או JSON, ואנו נאלצים לפרסס (Parsing)\ לנתח את הדף בעצמנו?

לכך מצאתי כמה פתרונות נחמדים:
הראשון, הפשוט יותרת שימוש בפונקציה אשר מחלצת נתונים המופיעים בין שתי מחרוזות (strings).
השני המתוחכם יותרת והנוח יותר הוא שימוש בספריית php המיצרת לנו DOM בתוך ה - PHP ומאפשרת לבצע שאילתות DOM וכן Selectors מתוך קוד ה - php על דף ה - HTML אותו אנו מנסים לפענח.



לפתרון הראשון:
// $text - is the full text we are searching on
// $from - is the opening text we start taking data from
// $to - is array of optional ending text we will fetch text until
// text_between('this is a full text', 'is', array('text')) - will return: ' is a full '
function text_between($text, $from, array $to)
{
$start = strpos($text, $from);
if($start === false)
return null;

$end = array();
for($i = 0; isset($to[$i]); ++$i)
{
$e = strpos($text, $to[$i], $start + strlen($from));
if($e !== false)
$end[] = $e;
}

$end = min($end);
return substr($text, $start + strlen($from), $end - $start - strlen($from));
}



הפתרון השני, שימוש בספרייה חיצונית הנקראת PHP Html DOM Parser
אשר מאפשר לבצע שאילתות DOM ישירות מתוך קוד ה - PHP גם באמצעות CSS Selectors כאילו אנחנו עובדים מתוך JavaScript או כל XML אחר.



// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images
foreach($html->find('img') as $element)
echo $element->src . '';

// Find all links
foreach($html->find('a') as $element)
echo $element->href . '';