Парсинг контента с сайта

Очень интересует вопрос по поводу парсинга контента с чужого сайта.
И самое главное, что не все сайты дают себя парсить.

Представим например, что на сайте находиться такой код:
<div class="test">Это нужно спарсить<br>с тегами внутри</div>
И такой код повторяется немножко
<div class="test">Это тоже нужно спарсить<br>с тегами внутри</div>

Вот как спарсить то его? Наверняка с помощью регулярных выражений и file_get_contents(), но я слышал, что курлом вроде лучше, правда не знаю почему, может что можно авторизацию проходить, но это в отдельно теме уже.
Было бы неплохо получить такое решение, уроков то много в интернете, но уже многие протестировал и ни один нормально не работает. Может руки карявые.
Думаю многим было бы интересно.

10 комментар

Incode 09.09.2014 10:01
На самом деле, информации и примеров по этой теме - более, чем достаточно. Разделить её можно условно на два этапа: чтение контента удалённой страницы и, собственно, парсинг полученного содержимого.
С первой частью - всё достаточно просто. Да, для этого можно использовать и file_get_contents(), и cURL, и др. Для простых ситуаций - первого способа вполне хватает, а cURL используют для более сложных задач. Например, если вам нужно пройти авторизацию на сайте или подключиться по протоколу HTTPS и многое другое.
А что касается второй части (парсинг, разбор содержимомго), то тут уж точно, что регулярки далеко не лучший вариант. Для этого используются соответствующие библиотеки: phpQuery (гляньте примеры и описание), Simple HTML DOM Parser (всё очень просто и расписано в документации с примерами), а так же можно обойтись без сторонних библиотек и использовать родной php-класс DOMDocument. В общем, как-то так ))
Kylaksizov 09.09.2014 10:20
Родная библиотека лучше? Не хочется подключать кучу всего лишнего.
Вот например DOMDocument::getElementById ищет id, а вот поиск по классам так и не нашёл. Как же его можно найти, как у меня в примере например?
Спасибо за полезные ссылки, жаль что не на русском)))
Incode 09.09.2014 10:26
Спасибо за полезные ссылки, жаль что не на русском
Ну, кое-что на русском, а для того же "Simple HTML DOM Parser" - так и не особо нужно, там на примерах легко разобраться.
По поводу поиска по классам, покажу пример:
$dom = new domDocument();
libxml_use_internal_errors(true);
$dom->loadHTMLFile ('http://incode.pro/user-questions/3/parsing-kontenta-s-sajta.html');
libxml_use_internal_errors(false);
$xpath = new DOMXPath($dom);
$results = $xpath->query("//*[@class='answer_author']");
if($results->length > 0) {
  for($i = 0; $i < $results->length; $i++){
    echo $results->item($i)->nodeValue , '<br>';
  }
}
Выведем на экран имена пользователей, которые общаются в этой же теме. Можно даже в песочнице протестить.
Kylaksizov 09.09.2014 10:45
Круто, что тут скажешь) А как понять вот это?
//*[@class='answer_author']

Заранее спасибо огромное.
Kylaksizov 09.09.2014 10:49
А вот с фриланса почему-то не хочет парсить например заголовки.
fl.ru
Incode 09.09.2014 11:02
@Kylaksizov, это одно из выражений для выбора узлов. Вот тут есть описание выражений.
$results = $xpath->query("//span"); // выбрать все span на странице
$results = $xpath->query("//*[@class='answer_author']"); // @ - выбрать по атрибуту class со значением "answer_author"
Incode 09.09.2014 11:22
А вот с фриланса почему-то не хочет парсить например заголовки.
Сейчас нет времени вникать, но скорее всего, что это как раз случай для cURL. И соединение по https, и авторизацию, скорее всего, что пройти нужно, и может даже куки подкидывать. Тут надо для каждого случая разбираться отдельно.
Kylaksizov 09.09.2014 18:37
Спасибо, столько полезных ссылок, что не хватит вкладок в браузере, спасибо)
Kylaksizov 09.09.2014 18:40
Прошу прощения, но на сайте не нашёл, как получить значение вместе с тегами, как я писал в первом вопросе?
Incode 09.09.2014 19:31
как получить значение вместе с тегами
Если возьмём мой пример выше, то:
// вместо кода, который выводи значение 
echo $results->item($i)->nodeValue , '<br>';
// Пишем следующее:
echo $dom->saveHTML($results->item($i));
Ваш комментарий:
X