{"id":958,"date":"2013-06-27T21:17:06","date_gmt":"2013-06-27T20:17:06","guid":{"rendered":"http:\/\/www.k-braungardt.de\/blogkb\/?p=958"},"modified":"2013-06-27T21:25:44","modified_gmt":"2013-06-27T20:25:44","slug":"webseiten-scrapen-html-parsen","status":"publish","type":"post","link":"https:\/\/www.k-braungardt.de\/blogkb\/?p=958","title":{"rendered":"Webseiten scrapen &#8211; HTML parsen"},"content":{"rendered":"<p>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 <a href=\"http:\/\/simplehtmldom.sourceforge.net\/\"> PHP Simple HTML DOM Parser<\/a>. Wie gut, h\u00c3\u00a4ngt dann aber auch vom Quelltext der Webseite ab. Strukturierung oder aussagekr\u00c3\u00a4ftige Tags sind in der Regel nicht zu erwarten. Deshalb bleibt h\u00c3\u00a4ufig nix anderes als alle Elemente des DOM einzeln abzugehen, besonders dann, wenn die Elemente verschachtelt, aber nicht konsequent in einer Hierarchie liegen. <\/p>\n<p>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\u00c3\u00b6nnen, diese aber gleichberechtigt nebeneinander stehen. Dies macht den Zugriff mit dem Parser schwierig. <\/p>\n<p><code>    <\/p>\n<div id=\"obersteebene1\">\n<h4>headline 1<\/h4>\n<div class=\"category\">category 1<\/div>\n<div class=\"item\">\n<ul>\n<li> <span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <span class=\"item_4\">test<\/span><br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<li><span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<\/ul>\n<\/div>\n<div class=\"category\">category 2<\/div>\n<div class=\"item\">\n<ul>\n<li> <span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <span class=\"item_4\">test<\/span><br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<li><span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<\/ul>\n<\/div>\n<div class=\"category\">category 3<\/div>\n<div class=\"item\">\n<ul>\n<li> <span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <span class=\"item_4\">test<\/span><br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<li><span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<\/ul>\n<\/div><\/div>\n<div id=\"obersteebene2\">\n<h4>headline 2<\/h4>\n<div class=\"category\">category 1<\/div>\n<div class=\"item\">\n<ul>\n<li> <span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <span class=\"item_4\">test<\/span><br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<li><span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<\/ul>\n<\/div>\n<div class=\"category\">category 2<\/div>\n<div class=\"item\">\n<ul>\n<li> <span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <span class=\"item_4\">test<\/span><br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<li><span class=\"item_1\">Stest<\/span> <span class=\"item_2\">test<\/span> <span class=\"item_4\">test<\/span> <br \/> <span class=\"item_3\">test<\/span><\/span><\/li>\n<\/ul>\n<\/div><\/div>\n<\/p><\/div>\n<p><\/code><br \/>\nDas Skript dazu so:<\/p>\n<blockquote><p>\n<code><br \/>\nfor($i=0; $i<count($oberstekategorie); $i++){\n$t=$oberstekategorie[$i];\necho $t;\necho \"<br \/>\";<br \/>\n$t2=\"div[id=\" . $t . \"]\";<br \/>\n$result= $html->find($t2);\/\/div mit oberster kategorie<br \/>\n$result=$result[0]; \/\/alles zugeh\u00c3\u00b6rig zu oberster kategorie<br \/>\n$categories=$result->find('.category');\/\/tag category wird gesucht, in einem array abgespeichert<br \/>\n$z=0;<br \/>\n\/\/jede oberste kategorie enth\u00c3\u00a4lt eine bestimmte zahl an items<br \/>\nforeach($result->find('.item') as $item)<br \/>\n{<br \/>\n\techo \"<br \/>\";<br \/>\n\techo $categories[$z]; \/\/tag category wird ausgegeben<br \/>\n\t$z++;<br \/>\n\techo \"<br \/>\";<br \/>\n    \/\/jedes item hat noch untergeordnete items<br \/>\n\t$one=$item->find('.item_1');<br \/>\n\t$two= $item->find('.item_2);<br \/>\n\t$three=$item->find('.item_3');<br \/>\n\t$four=$item->find('.item_4); \/\/dieses kann max 2x vorkommen<br \/>\n\t$tzwei=0;<br \/>\n    for($t=0; $t<count($one);$t++)\/\/unteritem $one ist auf jeden fall vorhanden\n    {\n         echo \"<br \/>\";<br \/>\n$test= $item->find('.item_1',$t);<br \/>\n  echo $test;<br \/>\n    $test2= $item->find('.item_2',$t)->plaintext;<br \/>\n    $test2=trim($test2);<br \/>\n\/\/***********<br \/>\n  if(isset($test2) && $test2!==\"\")<br \/>\n    {<br \/>\n    echo \" \". $test2;<br \/>\n        $test2=\"\";<br \/>\n    }<br \/>\n    else<br \/>\n    {<br \/>\n        echo \"nix\";<br \/>\n    }<br \/>\n        \/\/*****************<br \/>\n        echo \"<br \/>\";<br \/>\n        $test3=$item->find('.item_3',$t);<br \/>\n        $test3=trim($test3);<br \/>\n        if(isset($test3) && $test3!==\"\")<br \/>\n        {<br \/>\n            echo \" \". $test3;<br \/>\n            $test3=\"\";<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            echo \"nix3\";<br \/>\n        }<br \/>\n        \/\/****************************<br \/>\n        \/\/*****************<br \/>\n        echo \"<br \/>\";<br \/>\n        \/\/weil unteritem 4 max 2x vorkommen kann, wird ein extra z\u00c3\u00a4hler eingef\u00c3\u00bchrt<br \/>\n        if(isset($tzwei) && $tzwei!==0)<br \/>\n        {<br \/>\n            $tzwei++;<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            $tzwei=$t;<br \/>\n        }<br \/>\n        $test4=$item->find('.item_4,$tzwei);<br \/>\n        $test4=trim($test4);<br \/>\n        if(isset($test4) && $test4!==\"\")<br \/>\n        {<br \/>\n            echo \" \". $test4;<br \/>\n            $test4=\"\";<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n            echo \"item4 nr 1\";<br \/>\n        }<br \/>\n        \/\/****************************<br \/>\n        \/\/*****************<br \/>\n        echo \"<br \/>\";<br \/>\n         $tzwei++;<br \/>\n        $test5=$item->find('.item_4',$tzwei);<br \/>\n        $test5=trim($test5);<br \/>\n        if(isset($test5) && $test5!==\"\")<br \/>\n        {<br \/>\n            echo \" \". $test5;<br \/>\n            $test5=\"\";<br \/>\n        }<br \/>\n        else<br \/>\n        {<br \/>\n             echo \"item4 nr  2\";<br \/>\n        }<br \/>\n          echo \"<br \/>\";<br \/>\n        \/\/****************************<br \/>\n    }<br \/>\n\t}<br \/>\n\techo \"<br \/>\";<br \/>\n}<\/code><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>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&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/www.k-braungardt.de\/blogkb\/?p=958\">Weiterlesen<span class=\"screen-reader-text\">Webseiten scrapen &#8211; HTML parsen<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[263,34,264],"class_list":["post-958","post","type-post","status-publish","format-standard","hentry","category-wissen","tag-parser","tag-php","tag-scraping","entry"],"_links":{"self":[{"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=\/wp\/v2\/posts\/958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=958"}],"version-history":[{"count":5,"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=\/wp\/v2\/posts\/958\/revisions"}],"predecessor-version":[{"id":963,"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=\/wp\/v2\/posts\/958\/revisions\/963"}],"wp:attachment":[{"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=958"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=958"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.k-braungardt.de\/blogkb\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}