Я пытаюсь очистить веб-страницу для контента, используя 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