Top.Mail.Ru

Парсинг сайтов на PHP с помощью регулярных выражений

Парсинг сайтов на PHP с помощью регулярных выражений

Всем привет! Сегодня мы напишем скрипт PHP для парсинга сайта (то есть выборки определенных фрагментов теста или html тегов).

В примере будем парсить главную страницу моего сайта https://devopser.online/. Допустим, нужно спарсить пункты меню (правое меню) и поместить в отдельный файл.

Первое, что необходимо сделать – получить содержимое страницы. Это делается с помощью PHP функции file_get_contents:

$str = file_get_contents("https://devopser.online/");

В переменной $str будет находится все содержимое страницы, которое мы парсим, включая html, css, js и т.д.

Затем мы будем использовать регулярные выражения для выборки определенного текста, то есть пункты меню. В PHP используются разные функции регулярных выражений, но мы будем применять preg_match_all, так как у нас выборка состоит из массива элементов меню.

preg_match_all имеет 3 аргумента: 1 – шаблон, 2 – строка ( в нашем случае – html код страницы), 3 – массив с результатом выборки.

Открыв html код, можно увидеть, что все пункты правого меню помещены в html тег li с классом cat-item cat-item-19 – <li class=”cat-item cat-item-19″>

Регулярное выражение будет выглядеть следующим образом:

preg_match_all("#<li class=\"cat-item cat-item-.+?\"><a href=\"https://devopser.online/category/.+?\">(.+?)</a>.+?</li>#su", $str, $res);

Если вывести переменную $res, получим такие элементы массива: 1 – результат поиска по всему шаблону; 2 – сам текст (шаблон в скобках).

Нам нужен 2й элемент массива (в нем содержится текст).

Перебираем массив и записываем его поэлементно в файл.

file_put_contents("data.txt", "");
 
foreach ($res[1] as $value) {
file_put_contents("data.txt", $value."\n", FILE_APPEND);
}

\n нужен для того, чтобы после добавления текста курсор становился с новой строки.

Флаг FILE_APPEND добавляет текст в конец файла.

Весь программный код выглядит следующим образом:

 

<?php
$str = file_get_contents("https://devopser.online/");
preg_match_all("#<li class=\"cat-item cat-item-.+?\"><a href=\"https://devopser.online/category/.+?\">(.+?)</a>.+?</li>#su", $str, $res);
 
file_put_contents("data.txt", "");
 
foreach ($res[1] as $value) {
file_put_contents("data.txt", $value."\n", FILE_APPEND);
}

Автор:

262

Читайте также

0 комментариев