2013-11-27 2 views
0

У меня простая задача. Получите все статьи со страницы, а также получите все фотографии для каждой статьи.PHP Simple HTML DOM Parser: получить все сообщения

Сегодня я решил использовать PHP Simple HTML DOM Parse

В качестве примера, я использовал следующий код:

<?php 

include("simple_html_dom.php"); 

$sitesToCheck = array(
    array(
     'url' => 'http://googleblog.blogspot.ru/', 
     'search_element' => 'h2.title a', 
     'get_element' => 'div.post-content' 
    ), 
    array(
     // 'url' => '',   // Site address with a list of of articles 
     // 'search_element' => '', // Link of Article on the site 
     // 'get_element' => ''  // desired content 
    ) 
); 

$s = microtime(true); 

foreach($sitesToCheck as $site) 
{ 
    $html = file_get_html($site['url']); 

    foreach($html->find($site['search_element']) as $link) 
    { 
     $content = ''; 
     $savePath = 'cachedPages/'.md5($site['url']).'/'; 
     $fileName = md5($link->href); 

     if (! file_exists($savePath.$fileName)) 
     { 
      $post_for_scan = file_get_html($link->href); 

      foreach($post_for_scan->find($site["get_element"]) as $element) 
      { 
       $content .= $element->plaintext . PHP_EOL; 
      } 

      if (! file_exists($savePath) && ! mkdir($savePath, 0, true)) 
      { 
       die('Unable to create directory ...'); 
      } 

      file_put_contents($savePath.$fileName, $content); 
     } 
    } 
} 

$e = microtime(true); 

echo $e-$s; 

я попытаюсь получить только статьи без картинок. Но я получаю ответ от сервера

«Максимальное время исполнения 120 секунд превышено»

.

Пожалуйста, объясните мне, что я делаю неправильно ...

Скажите, есть ли другой способ, чтобы получить все статьи и все фотографии для каждой статьи по конкретному адресу?

+1

Так много для "простой" части, а. :) Серьезно, однако, в прошлый раз, когда я проверил его (несколько месяцев назад), simple_html_dom все еще был кучей паров. DOMDocument + DOMXPath занял около 1/5 места и времени. Буквально. Я избавился от использования памяти и времени выполнения на 80%, избавившись от нее. – cHao

+0

, вы не должны слишком полагаться на это, но если вы заранее знаете, что процесс займет много времени, попробуйте 'set_time_limit (0)', однако использовать его повсюду не рекомендуется. Это предотвратит убийство вашего компьютера, если оно превысит максимальное время выполнения (120 с в вашем случае), и оно будет работать до тех пор, пока оно не завершится. Проблема в том, что ... если вы допустили ошибку в своей программе, которая заставляет работать вечно, ваша программа будет сидеть на сервере, потребляющем ресурсы, до тех пор, пока не будет предпринято ручное действие. – ILikeTacos

+1

Просто так я не выгляжу, как бешеный ненавистник, есть одна вещь, которая может быть полезной для simple_html_dom. Если у вас есть HTML, который так плохо искажен, что он больше не похож на HTML, DOMDocument может не справиться с этим хорошо. Такой lib, как simple_html_dom *, может быть лучше с таким мусором, поскольку он предназначен для работы с дурацкой разметкой. Но редко приходится разбирать документ, который так ужасно нарушен, что DOMDocument не может его обработать. По крайней мере, мне никогда не приходилось иметь дело с этим. – cHao

ответ

1

У меня были схожие проблемы с этим lib. Использование РНР DOMDocument вместо:

$doc = new DOMDocument; 
$doc->loadHTML($html); 
$links = $doc->getElementsByTagName('a'); 
foreach ($links as $link) { 
    doSomethingWith($link->getAttribute('href'), $link->nodeValue); 
} 

См http://www.php.net/manual/en/domdocument.getelementsbytagname.php

+0

Спасибо. Теперь необходимо понять, как получить элементы, используя такие запросы, как 'div.post-content',' table.wrapper td.content' или 'div p a' и т. Д. – klay

Смежные вопросы