#php #html #парсер #dom
Парсю архив Ленты.ру. Нужно выбрать только новости за день, без категорий, то есть нужны все div, у которых присутствуют одновременно классы item и news, внутри всех этих div'ов нужно выбрать элемент a и, условно говоря, вывести/получить href. Версия, которая работает, НО работает неправильно, выглядит так: $news = $html->find( 'div[class=news] a' ); foreach( $news as $element ): echo $element->href . "\n"; endforeach; Неправильно потому что выборка идёт только по div'ам с классом news, а надо выборку по div'ам с классами item и news вместе. Пробовал так: $news = $html->find( 'div[class=item news] a' ); ...и так: $news = $html->find( 'div.item.news a' ); ...и так: $news = $html->find( 'div[class="item news"] a' ); Не работает. Варианты эти нашёл соответственно здесь и здесь. Принципиально ли использовать Simple HTML DOM Parser? Нет, не принципиально. Но с ним я уже знаком и имел опыт использования, поэтому выбор пал на него. Была ещё такая мысль: сначала найти все div с class=item, потом среди них найти все div с class=news, потом в каждом из них найти a, но у меня не получилось. Как я понял, цепочка методов а-ля $news = $html->find( 'div[class=item]' )->find( 'div[class=news] a' ); не сработает (у меня не работает). Как быть? P.S. Добавлю. Сейчас глянул ещё здесь, да, решение рабочее, всё нормально работает. Если полностью прописать все классы: $news = $html->find( 'div[class=item news b-tabloid__topic_news] a' ); Но дело в том, что последний класс b-tabloid__topic_news там присутствует не везде, то есть его наличие не обязательно. Да, можно наговнокодить алгоритм с массивами, ищем сначала такие, потом другие, склеиваем, сортируем и т.д, но это ИМХО криво. В общем, вопрос можно переформулировать так: как найти все элементы, у которых среди классов есть нужные?
Ответы
Ответ 1
В целом понятно, что данная библиотека не умеет корректно обрабатывать селекторы, где перечисляются два и более класса подряд. Тем не менее, вы в целом смотрите в нужном направлении, используя форму записи div[class=...]. Рассмотрим исходный тестовый пример: $txt = <<
Комментариев нет:
Отправить комментарий