@andreystrelkov

Как спарсить div со страницы?

Добрый вечер, пытаюсь спарсить основной текст новости со страницы сайта lenta.ru
не выходит, что я не так делаю

$html = file_get_contents('https://lenta.ru/news/2016/06/02/trol/');
if (preg_match('#<span class="b-text">(\d+?)</span>#', $html, $matches)) {
  $price = $matches[1]; 
}
echo $price;
  • Вопрос задан
  • 349 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Sanitar88
Студень
$matches[0] ?

ну да, и, если парсить основной текст, \d+? - это не текст вовсе
Ответ написан
Immortal_pony
@Immortal_pony Куратор тега PHP
Во-первых, у Ленты есть RSS, привязываться к верстке нежелательно:

На момент запуска нового сайта доступны следующие RSS:

/rss/news — новости
/rss/top7 — самые свежие и самые важные новости
/rss/last24 — главные новости за последние сутки
/rss/articles — все статьи
/rss/columns — колонки
/rss/news/russia — новости рубрики «Россия»; после косой черты можно написать английское название любой рубрики — обращайте внимание на их url (например, /rss/news/world — это уже все новости рубрики «Мир»)
/rss/articles/russia — все статьи рубрики «Россия»; управление рубриками аналогичное
/rss/photo — все галереи
/rss/photo/russia — все галереи рубрики «Россия»; управление рубриками аналогичное


Во-вторых, что касается парсинга XML, то регулярные выражения для этого использовать также не лучшая идея. Их вообще лучше никогда не использовать при возможности. Распарсить XML можно с помощью SimpleXML или Nokogiri. И конкретно для RSS есть несколько библиотек.

Пример:
libxml_use_internal_errors(true); // Не провоцировать генерацию ошибок в php из-за ошибок разбора html 

$html = file_get_contents("https://lenta.ru/news/2016/06/02/trol/");
$page = new domDocument();
$page->loadHTML("<?xml version='1.0' encoding='UTF-8'?>" . $html); // Явное указание кодировки полученных данных

$article = "";
$domXpath = new DOMXPath($page);
$newDom = new DOMDocument();
$newDom->formatOutput = true;

$filtered = $domXpath->query("//div[@itemprop='articleBody']");
$i = 0;
while ($item = $filtered->item($i++)) {
    $node = $newDom->importNode($item, true);
    $newDom->appendChild($node);
}

$article = $newDom->saveHTML();
libxml_clear_errors(); // Очищение буфера ошибок.
Ответ написан
@VSKut
Советую взять что-нибудь на подобии этого: simplehtmldom.sourceforge.net
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы