HTML parsen – Teil 2

Im großen und ganzen funktioniert es mit dem HTML Simple DOM Parser.
Durch LI-Tags ist mein Quelltext dann doch noch leicht strukturierter als ursprünglich gedacht. Jedes Item auf der untersten Ebene steckt innerhalb eines solchen, so dass ich die enthaltenen Elemente, auch die doppelten, einfach ansprechen könnte. Für die doppelten funktioniert es nicht. i4 geht schon auf das nächste LI, obwohl ich ein bestimmtes LI anspreche. Gibt womöglich hier einen Denkfehler. Mein Modell war dieses hier aus der Doku gewesen:

$e = $html->find('ul', 0)->find('li', 0);

for($b=0; $b<$lizahl;$b++) { $e = $item->find(‚li‘, $b);
$i1= $e->find(‚.item_1‘,0)->plaintext;
$i2= $e->find(‚.item_2‘,0)->plaintext;
$i3= $e->find(‚.item_3‘,0)->plaintext;
$i4= $e->find(‚.item_3‘,1)->plaintext;

}

}

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 "
";
}