"Enter" drücken, um zum Inhalt weiterzugehen

Webseiten scrapen – HTML parsen

Wenn es kein XML oder RSS oder sonst irgendwie strukturierte Daten gibt, muss man direkt an die Webseite gehen. Auf PHP-Basis geht es gut mit dem PHP Simple HTML DOM Parser. Wie gut, hängt dann aber auch vom Quelltext der Webseite ab. Strukturierung oder aussagekräftige Tags sind in der Regel nicht zu erwarten. Deshalb bleibt häufig nix anderes als alle Elemente des DOM einzeln abzugehen, besonders dann, wenn die Elemente verschachtelt, aber nicht konsequent in einer Hierarchie liegen.

Mein Beispiel ist folgendes: Die Html-Ausgangsbasis sieht wie folgt aus, abstrahiert. Das Problem ist, dass innerhalb der Item-Klasse mehrere Items mit Unteritems vorhanden sein können, diese aber gleichberechtigt nebeneinander stehen. Dies macht den Zugriff mit dem Parser schwierig.

headline 1

category 1
  • Stest test test test
    test
  • Stest test test
    test
category 2
  • Stest test test test
    test
  • Stest test test
    test
category 3
  • Stest test test test
    test
  • Stest test test
    test

headline 2

category 1
  • Stest test test test
    test
  • Stest test test
    test
category 2
  • Stest test test test
    test
  • Stest test test
    test


Das Skript dazu so:


for($i=0; $i";
$t2="div[id=" . $t . "]";
$result= $html->find($t2);//div mit oberster kategorie
$result=$result[0]; //alles zugehörig zu oberster kategorie
$categories=$result->find('.category');//tag category wird gesucht, in einem array abgespeichert
$z=0;
//jede oberste kategorie enthält eine bestimmte zahl an items
foreach($result->find('.item') as $item)
{
echo "
";
echo $categories[$z]; //tag category wird ausgegeben
$z++;
echo "
";
//jedes item hat noch untergeordnete items
$one=$item->find('.item_1');
$two= $item->find('.item_2);
$three=$item->find('.item_3');
$four=$item->find('.item_4); //dieses kann max 2x vorkommen
$tzwei=0;
for($t=0; $t";
$test= $item->find('.item_1',$t);
echo $test;
$test2= $item->find('.item_2',$t)->plaintext;
$test2=trim($test2);
//***********
if(isset($test2) && $test2!=="")
{
echo " ". $test2;
$test2="";
}
else
{
echo "nix";
}
//*****************
echo "
";
$test3=$item->find('.item_3',$t);
$test3=trim($test3);
if(isset($test3) && $test3!=="")
{
echo " ". $test3;
$test3="";
}
else
{
echo "nix3";
}
//****************************
//*****************
echo "
";
//weil unteritem 4 max 2x vorkommen kann, wird ein extra zähler eingeführt
if(isset($tzwei) && $tzwei!==0)
{
$tzwei++;
}
else
{
$tzwei=$t;
}
$test4=$item->find('.item_4,$tzwei);
$test4=trim($test4);
if(isset($test4) && $test4!=="")
{
echo " ". $test4;
$test4="";
}
else
{
echo "item4 nr 1";
}
//****************************
//*****************
echo "
";
$tzwei++;
$test5=$item->find('.item_4',$tzwei);
$test5=trim($test5);
if(isset($test5) && $test5!=="")
{
echo " ". $test5;
$test5="";
}
else
{
echo "item4 nr 2";
}
echo "
";
//****************************
}
}
echo "
";
}

Als Erster einen Kommentar schreiben

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert