Intereting Posts
Laravel – данные POST равны нулю при использовании внешнего запроса Почему функция call_user_func () PHP не поддерживает передачу по ссылке? Наследование PHP и видимость защищенного элемента PHP Regex для обнаружения ОС Издевательские модели Laravel Eloquent – как установить публичную собственность с помощью Mockery Библиотека классов php-ews всегда возвращает null Tricky mysql подсчет числа каждого дня в диапазоне дат передача параметра поиска через jquery PHP: Может включать файл, который file_exists () говорит, не существует Недопустимый аргумент для foreach () – API поиска Bing php: Как сохранить сокет клиента (не закрыт), так что дополнительный скрипт может получить его для отправки ответа? Загрузите несколько файлов в виде zip-файла, используя php Apache: как добавить заголовки Expires в файлы без установленных mod_expires Как получить сегодняшние / вчера данные из базы данных MySQL? Как вставить HTML в PHP DOMNode?

Веб-скребок с DOMDocument

Я пытаюсь очистить веб-страницу для контента, используя file_get_contents чтобы захватить HTML, а затем с помощью объекта DOMDocument . Моя проблема в том, что я не могу получить соответствующую информацию. Я не уверен, что это связано с тем, что я DOMDocument использую DOMDocument или если (X) HTML в моем источнике просто беден.

В источнике есть элемент с идентификатором «cards», который имеет два дочерних div s. Мне нужен первый ребенок, у которого есть много дочерних div , которые, в свою очередь, имеют anchor ребенка с дочерью div . Я хочу, чтобы href из anchor и nodeValue из его дочернего div .

Структура выглядит так:

 <div id="cards"> <div class="grid"> <div class="card-wrap"> <a href="linkValue"> <img src="..."/> <div>nameValue</div> </a> </div> ... </div> <div id="..."> </div> </div> - <div id="cards"> <div class="grid"> <div class="card-wrap"> <a href="linkValue"> <img src="..."/> <div>nameValue</div> </a> </div> ... </div> <div id="..."> </div> </div> 

Я начал с $cards = $dom->getElementById("cards") . Я получаю объект DOMText, объект DOMElement, объект DOMText, объект DOMElement и объект DOMText. Затем я использую $grid = $cards->childNodes->item(1) чтобы получить первый объект DOMElement, который предположительно является элементом .grid . Однако, когда я затем перебираю сетку $ с:

 foreach($grid->childNodes as $item){ if($item->nodeName == "div"){ echo $item->nodeName,' | ',$item->nodeValue,'<br>'; } } 

Я заканчиваю страницей, полной «div | nameValue», где nameValue является встроенным div nodeValue , и я не могу найти nodeValue s, чтобы получить их значение href .

Я делаю что-то явно не так с моим DOMDocument, или, может быть, здесь что-то происходит?

Ну, из вашего примера кода if($item->nodeName == "div"){ очень хочет исключить любой тег <a> . Кроме того, я не верю, что childNodes допускает рекурсивную итерацию.

Поэтому для доступа к указанным узлам вы можете использовать:

 $children = $dom->getElementById("cards")->childNodes ->item(1)->childNodes->item(1)->childNodes; 

Тем не менее, как вы видите, это очень грязно … Представляем XPath:

Путь XPath:

 $src = <<<EOS <div id="cards"> <div class="grid"> <div class="card-wrap"> <a href="linkValue"> <img src="..."/> <div>nameValue</div> </a> </div> </div> <div id="whatever"> </div> </div> EOS; $xml = new SimpleXMLElement($src); list ($anchor) = $xml->xpath('//div[@id="cards"]/div[1]/div[1]/a'); echo $anchor->div, ' => ', $anchor['href'], PHP_EOL; - $src = <<<EOS <div id="cards"> <div class="grid"> <div class="card-wrap"> <a href="linkValue"> <img src="..."/> <div>nameValue</div> </a> </div> </div> <div id="whatever"> </div> </div> EOS; $xml = new SimpleXMLElement($src); list ($anchor) = $xml->xpath('//div[@id="cards"]/div[1]/div[1]/a'); echo $anchor->div, ' => ', $anchor['href'], PHP_EOL; 

«Получить привязку первого дочернего div первого дочернего div div с идентификатором« карт »»

Вывод:

 nameValue => linkValue