2013-11-27 3 views
0

У меня есть следующий запрос XPath:не захватывая XPath содержание

//div[@class="row"]//div[@class="post-container"]//div[contains(@class,"post-content")]//p 

Я пытаюсь захватить содержимое статьи из следующего URL:

http://gawker.com/u-s-pulls-ahead-in-taylor-swift-education-continues-t-1445261687

Это, кажется, не работать. То, что я ожидал, было массив DOMNodes со всеми тегами p.

Вот мой код:

error_reporting(E_ERROR); 
$domDocument = new DOMDocument('1.0','UTF-8'); 
$urlText = file_get_contents($url); 
$domDocument->loadHTML($urlText); 
$finder = new DOMXPath($domDocument); 
$xpath = '//div[@class="row"]//div[@class="post-container"]//div[contains(@class,"post-content")]//p'; 
$xpathContents = $finder->query($xpath); 

ПРИМЕЧАНИЯ: Мне нужно использовать file_get_contents для дополнительной синтаксического анализа логики

+1

вы пробовали это: '// ДИВ [содержит (@class, "пост-контента")] // p' – tttony

+0

@tttony да. я действительно запутался в том, почему он не возвращает контент. xpaths верны. Я заметил, что есть атрибут в элементе p 'data-textannotation-id =" 234d4be1de6ac84e6326becfa3459ee9 "'. Вы думаете, что это влияет на xpath? – jkushner

+1

Начните упрощать xpath. начните удаление терминов, пока вы не начнете что-то возвращать. там, где ваш xpath сошел с рельсов. –

ответ

0

Причина благодаря некоторым недействительным <script> тегу, который включен только под первым <p> теге , Он закрывает теги внутри некоторого документа document.write, который, как я предполагаю, «возится с голосом DOMDocument/DOMXPath».

Это не слишком классно, но вы можете избежать этого, загрузив документ, который вы прочитали в SimpleXML, и выполните модифицированный запрос XPath на основе идентификатора data-textannontation-id (который избегает неприятного тега скрипта).

error_reporting(E_ERROR); 
$domDocument = new DOMDocument('1.0','UTF-8'); 
$urlText = file_get_contents('g'); 
$domDocument->loadHTML($urlText); 
$sxe = simplexml_import_dom($domDocument); 
$xpath = '//*[@data-textannotation-id]'; 
$xpathContents = $sxe->xpath($xpath); 

// What do you know, there is 8 items here... woop woop! 
print_r($xpathContents); 

// bonus points, here is the text output! 
$text = ''; 
foreach ($xpathContents as $node) { 
    $text .= trim((string)dom_import_simplexml($node)->textContent); 
} 
echo $text; 
Смежные вопросы