Skip to main content

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 . '';




Comments

Popular posts from this blog

Using phpword to merge two Mircrosoft Office Word .docx documents

How to combine or embed and insert another .docx file (Microsoft office docx word document) into another one using PHPWord Joining two .docx document using php ( phpword library ) $mainTemplateProcessor = new \PhpOffice\PhpWord\TemplateProcessor("file1"); //$mainTemplateProcessor ->setValue('var_name', $value); $innerTemplateProcessor = new \PhpOffice\PhpWord\TemplateProcessor("file2"); //$innerTemplateProcessor->setValue('var2_name', $value2); // extract internal xml from template that will be merged inside main template $innerXml = $innerTemplateProcessor->gettempDocumentMainPart(); $innerXml = preg_replace('/^[\s\S]*<w:body>(.*)<\/w:body>.*/', '$1', $innerXml); // remove tag containing header, footer, images $innerXml = preg_replace('/<w:sectPr>.*<\/w:sectPr>/', '', $innerXml); // inject internal xml inside main template $mainXml = $mainTemplateProcessor->gettempDocumentMainPart(

Bypassing the error by "go get" "tls: failed to verify certificate: x509: certificate signed by unknown authority"

When I was trying to download dependencies for my go project in an old Ubuntu machine I was getting this error all the time: "go: gopkg.in/alexcesaro/quotedprintable.v3@v3.0.0-20150716171945-2caba252f4dc: Get "https://proxy.golang.org/gopkg.in/alexcesaro/quotedprintable.v3/@v/v3.0.0-20150716171945-2caba252f4dc.mod": tls: failed to verify certificate: x509: certificate signed by unknown authority" Which the main part of it was go get failing to authenticate: " tls: failed to verify certificate: x509: certificate signed by unknown authority " I tried many things but couldn't make it work until I found the way: export GOINSECURE="proxy.golang.go" This will tell go get to ignore certification validity. Then export GOPROXY=direct This will tell go get to by pass proxy Then git config --global http.sslverify false And only after those I could run again: go get And it worked