
В данной статье хочу привести пример парсера контента на основе библиотеки simple_html_dom.php.
В статье я довольно подробно оставил все комментарии. Мы используем как саму библиотеку, так и регулярные выражения. в последствии можно всё писать в базу или текстовый файл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
<?php //ставим лимит памяти больше, т.к. библиотека затратна к ресурсам ini_set('memory_limit', '128M'); //так же ставим больше время сессии set_time_limit(800); //начинаем сессию session_start(); //подключаем библиотеку парсера include 'simple_html_dom.php'; //будем парсить контент с фишек.нет, в переменную link задаём адрес главной страницы $link = 'http://fishki.net'; //создаём новый dom элемент $data = file_get_html($link); //сейчас мы вытащим все ссылки с главной страницы и поместим это всё в архив $result = array(); //ссылки у нас находятся между тегами h2 foreach($data->find('h2[class=post_title] a') as $ssilki){ //из полученного вытаскиваем именно код тега $ssilki->tag; //из полученного тега вытаскиваем атрибут href - атрибут адреса $ssilki->href; //помещаем всё в массив $result['ssilki'][] = $ssilki; } //т.к. ссылка у нас относительная, нам нужно заменить её на абсолютную, замену делаем по строчно для первой ссылки в массиве $fut1 = str_replace("href=\"", "href=\"http://fishki.net", $result['ssilki'][0]); //для второй ссылки в массиве, ну и так далее $fut2 = str_replace("href=\"", "href=\"http://fishki.net", $result['ssilki'][1]); //далее при помощи регулярных выражений разбираем весь тег на составляющие, начало тега, текст ссылки, конец тега preg_match('~<a.*?href="([^"]+)".*?>(.*?)</a>~s', $fut1, $matches); //делаем тоже самое для второго эллемента preg_match('~<a.*?href="([^"]+)".*?>(.*?)</a>~s', $fut2, $matches1); // подчищаем за собой - это нужно обязательно, т.к. simple_html_dom.php очень требователен к ресурсам и без чистки скрипт отвалится $data->clear(); unset($data); //парсим первый пост по первой из ссылок //создаём новый dom элемент, вытаскиваем первую ссылку из массива $post1 = file_get_html($matches[1]); //ищем текст заголовка h1 с классом post_title foreach($post1->find('h1[class=post_title]') as $title1); //выводим наш заголовок echo $title1; $post1->clear();// подчищаем за собой, как я уже писал после каждого поиска это обязательно unset($post1); //парсим сам текст статьи, создаём снова новый dom объект $cont1 = file_get_html($matches[1]); //ищем весь код между тегами div class="post_content" foreach($cont1->find('div[class=post_content]') as $infa1); //удаляем блок с ссылками поделиться, он находится между div class="pic-share-holder" foreach($cont1->find('div[class=pic-share-holder]') as $element1) $element1->outertext = ''; //удаляем подпись автора, она находится в классе div class="post-source" foreach($cont1->find('div[class=post-source]') as $element11) $element11->outertext = ''; //остальной текст переводим в именно текст $infa1->plaintext; //далее на фишках каждый абзац находится в теге li - теге маркированного списка, это некая защита, удаляем теги с помощью регулярных выражений $text1 = eregi_replace("<li[^>]*>"," ",$infa1); $text1 = eregi_replace("</li>"," ",$text1); //выводим наш текст echo $text1; $cont1->clear();// подчищаем за собой unset($cont1); //парсим второй пост аналогично первому $post2 = file_get_html($matches1[1]); foreach($post2->find('h1[class=post_title]') as $title2); echo $title2; $post2->clear();// подчищаем за собой unset($post2); $cont2 = file_get_html($matches1[1]); foreach($cont2->find('div[class=post_content]') as $infa2); foreach($cont2->find('div[class=pic-share-holder]') as $element2) $element2->outertext = ''; foreach($cont2->find('div[class=post-source]') as $element22) $element22->outertext = ''; $infa2->plaintext; $text2 = eregi_replace("<li[^>]*>"," ",$infa2); $text2 = eregi_replace("</li>"," ",$text2); echo $text2; $cont2->clear();// подчищаем за собой unset($cont2); ?> |
.
But I could never get a single idea for a strathmore writing paper story