2016-12-07 3 views
-1

Я пытаюсь получить содержимое внутри div, называемого «item-page». Html происходит из сеанса curl и содержится в переменной $ html. Я использую getElementsByTagName, но он работает только с «div» как значением в(), если я положил «p», он не работает. Кто-нибудь знает, почему?getElementsByTagName не работает с 'p' (абзац)

Вот это код:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$div = $dom->getElementsByTagName('p'); 
foreach ($div as $tag) { 
    if ($tag->getAttribute('class') === 'item-page') { 
     echo $tag->nodeValue."<br>"; 
    } 
} 

Вот это источник HTML (один абзац я должен повторить) с сайта:

<div class="item-page"> 
<p> Chiusura dell'Istituto per gioved&igrave; 8 dicembre 2016 </p> 
</div> 

(Причина я использую «р» потому что я могу начать новую строку для каждого абзаца, если я использую «div», он отображается как один блок).

+2

Как косяк 'p' тег имеет атрибут' class' если только 'div' она? – JOUM

+0

* «Это не работает» *: не могли бы вы объяснить, что это значит? – trincot

+0

Этот вопрос не имеет ничего общего с языком программирования P, пожалуйста, не используйте тег [tag: p]. – JAL

ответ

0

, если он работает с «DIV», но не с «р», это означает, что $ HTML не содержит р элементов с классом элемента-странице

0

Я побежал этот код:

<?php 
$html = "<div class=\"item-page\"> 
<p> Chiusura dell'Istituto per gioved&igrave; 8 dicembre 2016 </p> 
</div>"; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$div = $dom->getElementsByTagName('p'); 

var_dump($div[0]); 
die(); 

foreach ($div as $tag) { 
    if ($tag->getAttribute('class') === 'item-page') { 
     echo $tag->nodeValue."<br>"; 
    } 
} 

и я получаю ответ я ожидал:

object(DOMElement) #3 (18) { ["tagName"]= > string(1) 
"p" ["schemaTypeInfo"] => NULL["nodeName"] => string(1) 
"p" ["nodeValue"] => string(53) 
" Chiusura dell'Istituto per giovedì 8 dicembre 2016 " ["nodeType"] => int(1)["parentNode"] => string(22) 
"(object value omitted)" ["childNodes"] => string(22) 
"(object value omitted)" ["firstChild"] => string(22) 
"(object value omitted)" ["lastChild"] => string(22) 
"(object value omitted)" ["previousSibling"] => string(22) 
"(object value omitted)" ["nextSibling"] => string(22) 
"(object value omitted)" ["attributes"] => string(22) 
"(object value omitted)" ["ownerDocument"] => string(22) 
"(object value omitted)" ["namespaceURI"] => NULL["prefix"] => string(0) 
"" ["localName"] => string(1) 
"p" ["baseURI"] => NULL["textContent"] => string(53) 
" Chiusura dell'Istituto per giovedì 8 dicembre 2016 " 
} 

Обратите внимание, что в соответствии с документацией, getElementByTagName возвращает список

1

Это не работает, потому что элемент «p» на вашей странице не имеет класса «item-page», как ожидается, ваш код. Если вы удалите этот оператор if, он будет работать так, как вы ожидаете.

0

Удалить p от $dom->getElementsByTagName() и добавить div, чтобы ваш результат показывал все div на странице.

<?php 

$html = <<<EOT 

<html> 
<head></head> 
<body> 
<div class="item-page"> 
<p> Chiusura dell'Istituto per gioved&igrave; 8 dicembre 2016 </p> 
</div> 
</body> 
</html> 

EOT; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$div = $dom->getElementsByTagName('div'); 

foreach ($div as $tag) { 
    if ($tag->getAttribute('class') === 'item-page') { 
     echo $tag->nodeValue."<br>"; 
    } 
} 

Выход

Chiusura dell'Istituto per giovedì 8 dicembre 2016 
Смежные вопросы