Frage

Was sind die Vor- und Nachteile der folgenden Bibliotheken?

Aus dem oben Ich habe QP verwendet und es versäumt zu parsen ungültige HTML und simpleDomParser, die einen guten Job macht, aber es leckt ein bisschen Speicher wegen des Objektmodells. Sie können jedoch, dass unter Kontrolle halten, indem $object->clear(); unset($object); Aufruf, wenn Sie mehr ein Objekt nicht benötigen.

Gibt es mehr Schaber? Was sind Ihre Erfahrungen mit ihnen? Ich werde diese ein Community Wiki machen, können wir eine nützliche Liste von Bibliotheken aufbauen, die nützlich sein können, wenn Schaben.


Ich habe einige Tests auf der Basis Byrons Antwort:

    <?
    include("lib/simplehtmldom/simple_html_dom.php");
    include("lib/phpQuery/phpQuery/phpQuery.php");


    echo "<pre>";

    $html = file_get_contents("http://stackoverflow.com/search?q=favorite+programmer+cartoon");
    $data['pq'] = $data['dom'] = $data['simple_dom'] = array();

    $timer_start = microtime(true);

    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $x = new DOMXPath($dom);

    foreach($x->query("//a") as $node)
    {
         $data['dom'][] = $node->getAttribute("href");
    }

    foreach($x->query("//img") as $node)
    {
         $data['dom'][] = $node->getAttribute("src");
    }

    foreach($x->query("//input") as $node)
    {
         $data['dom'][] = $node->getAttribute("name");
    }

    $dom_time =  microtime(true) - $timer_start;
    echo "dom: \t\t $dom_time . Got ".count($data['dom'])." items \n";






    $timer_start = microtime(true);
    $doc = phpQuery::newDocument($html);
    foreach( $doc->find("a") as $node)
    {
       $data['pq'][] = $node->href;
    }

    foreach( $doc->find("img") as $node)
    {
       $data['pq'][] = $node->src;
    }

    foreach( $doc->find("input") as $node)
    {
       $data['pq'][] = $node->name;
    }
    $time =  microtime(true) - $timer_start;
    echo "PQ: \t\t $time . Got ".count($data['pq'])." items \n";









    $timer_start = microtime(true);
    $simple_dom = new simple_html_dom();
    $simple_dom->load($html);
    foreach( $simple_dom->find("a") as $node)
    {
       $data['simple_dom'][] = $node->href;
    }

    foreach( $simple_dom->find("img") as $node)
    {
       $data['simple_dom'][] = $node->src;
    }

    foreach( $simple_dom->find("input") as $node)
    {
       $data['simple_dom'][] = $node->name;
    }
    $simple_dom_time =  microtime(true) - $timer_start;
    echo "simple_dom: \t $simple_dom_time . Got ".count($data['simple_dom'])." items \n";


    echo "</pre>";

und bekam

dom:         0.00359296798706 . Got 115 items 
PQ:          0.010568857193 . Got 115 items 
simple_dom:  0.0770139694214 . Got 115 items 
War es hilfreich?

Lösung

Ich habe einfach HTMLDOM ausschließlich zu verwenden, bis einige hellen SO'ers zeigten mir das Licht Halleluja.

Nur die in DOM-Funktionen gebaut verwenden. Sie sind in C und ein Teil des PHP-Kern geschrieben. Sie sind schneller effizienter als jede dritte Partei Lösung. Mit Firebug ist eine XPath-Abfrage immer Muey einfach. Diese einfache Änderung hat meine PHP-basierten Schaber laufen schneller gemacht, während meine kostbare Zeit zu sparen.

verwendete Mein Schaber ~ 60 Megabytes nimmt 10 Stellen zu kratzen asynchron mit Curl. Das war auch bei der einfachen HTML-DOM-Speicher fix Sie erwähnten.

Jetzt Prozesse meine php nie über 8 Megabyte gehen.

Sehr zu empfehlen.

Bearbeiten

Okay, ich habe einige Benchmarks. Errichtet in dem dom ist mindestens eine Größenordnung schneller.

Built in php DOM: 0.007061
Simple html  DOM: 0.117781

<?
include("../lib/simple_html_dom.php");

$html = file_get_contents("http://stackoverflow.com/search?q=favorite+programmer+cartoon");
$data['dom'] = $data['simple_dom'] = array();

$timer_start = microtime(true);

$dom = new DOMDocument();
@$dom->loadHTML($html);
$x = new DOMXPath($dom); 

foreach($x->query("//a") as $node) 
{
     $data['dom'][] = $node->getAttribute("href");
}

foreach($x->query("//img") as $node) 
{
     $data['dom'][] = $node->getAttribute("src");
}

foreach($x->query("//input") as $node) 
{
     $data['dom'][] = $node->getAttribute("name");
}

$dom_time =  microtime(true) - $timer_start;

echo "built in php DOM : $dom_time\n";

$timer_start = microtime(true);
$simple_dom = new simple_html_dom();
$simple_dom->load($html);
foreach( $simple_dom->find("a") as $node)
{
   $data['simple_dom'][] = $node->href;
}

foreach( $simple_dom->find("img") as $node)
{
   $data['simple_dom'][] = $node->src;
}

foreach( $simple_dom->find("input") as $node)
{
   $data['simple_dom'][] = $node->name;
}
$simple_dom_time =  microtime(true) - $timer_start;

echo "simple html  DOM : $simple_dom_time\n";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top