PHP: получение содержимого со страницы HTML с помощью xpath () - PullRequest
0 голосов
/ 14 октября 2010

Я пытаюсь извлечь содержимое div на html-странице, используя xpath и domdocument.Это структура страницы:

<div id="content">
<div class="div1"></div>
<span class="span1></span>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<div class="div2"></div>
</div>

Я хочу получить только содержимое p, а не span и div.Я пришел через это выражение xpath . // * [@ id = 'content'] / p , но думаю, что-то не так, потому что я получаю только первый p.Попытался использовать другое выражение с follow-sibling и node (), но все они возвращают только первое p.

.//*[@id='content']/span/following-sibling::p
.//*[@id='content']/node()[self::p]

Вот как используется xpath:

$domDocument=new DOMDocument();
$domDocument->encoding = 'UFT8';
$domDocument->loadHTML($page);
$domXPath = new DOMXPath($domDocument);
$domNodeList = $domXPath->query($this->xpath);
$content = $this->GetHTMLFromDom($domNodeList);

И вот какHTML из узлов:

private function GetHTMLFromDom($domNodeList){
$domDocument = new DOMDocument();
$node = $domNodeList->item(0);   
 foreach($node->childNodes as $childNode)
 $domDocument->appendChild($domDocument->importNode($childNode, true));
return $domDocument->saveHTML();
}

1 Ответ

2 голосов
/ 14 октября 2010

Это выражение XPath:

//div[@id='content']/p

Результат в наборе нужных узлов (пять p элементов)

РЕДАКТИРОВАТЬ : Теперь понятно, в чем ваша проблема. Вам нужно перебрать NodeList:

private function GetHTMLFromDom($domNodeList){ 
   $domDocument = new DOMDocument(); 
   foreach ($nodelist as $node) {
      $domDocument->appendChild($domDocument->importNode($node, true)); 
   }
   return $domDocument->saveHTML(); 
} 
...