2014-01-26 3 views
0

Я пытался получать содержимое только на <div class="start-teaser"> из this rss feed с вышеприведенным сценарием, попытался с xpath, как это:Grab/Получить содержимое из нижестоящего тега из Фида

$xpath = new DOMXPath($html); $desc = $xpath->query("//*[@class='start-teaser']"); 

Но это не принимая Это. И я не понимаю, почему. я также пытался сделать что-л так:

$desc = $html->getElementsByTagName('p')->item(0)->getAttribute('class'); 

Но это возвращает только имя класса. И мне нужно содержимое (текст) этого div, а не имя класса.

public function NewsRss() { 
$rss = new DOMDocument(); 
$rss->load('http://www.autoexpress.co.uk/feeds/all'); 
$feed = array(); 
foreach ($rss->getElementsByTagName('item') as $node) { 
    $htmlStr = $node->getElementsByTagName('description')->item(0)->nodeValue; 
    $html = new DOMDocument();   
    $html->loadHTML($htmlStr); 
    $xpath = new DOMXPath($html); 
    $desc = $xpath->query("//*[@class='start-teaser']"); 
    $imgTag = $html->getElementsByTagName('img'); 
    $img = ($imgTag->length==0)?'noimg.png':$imgTag->item(0)->getAttribute('src'); 
    $item = array (
    'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 
    //'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 
    'desc' => $desc, 
    'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 
    'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue, 
'image' => $img, 
); 
    array_push($feed, $item); 
} 
$limit = 3; 
for($x=0;$x<$limit;$x++) { 
    $title = str_replace(' & ', ' &amp; ', $feed[$x]['title']); 
    $link = $feed[$x]['link']; 
    $description = $feed[$x]['desc']; 
    $date = date('l F d, Y', strtotime($feed[$x]['date'])); 
    echo '<div class="news-row-index">'; 
    echo '<div class="img"><a href="'.$link.'" target="_blank" title="'.$title.'"><img src="'.$feed[$x]['image'].'" height="79" width="89"></a></div>'; 
    echo '<div class="details-index"><p><h5><a href="'.$link.'" target="_blank" title="'.$title.'">'.$title.'</a></h5><br />'; 
    echo '<small><em>Posted on '.$date.'</em></small></p>'; 
    echo '<p>'.$feed[$x]['desc'].'</p></div>'; 
    echo '</div>'; 
} 
echo '<a style="margin-left:10px;" class="view-all-but" target="_blank" href="http://www.autoexpress.co.uk/feeds/all">View all</a>'; 
} 

ответ

1

Значение класса short-teaser, не start-teaser; поэтому вместо этого используйте //*[@class='short-teaser'].

Для сравнения HTML классы, также принять этот вопрос во внимание: How can I match on an attribute that contains a certain string?

+0

ах не заметил, класс, изменил его, но до сих пор не работает правильно: http://pastebin.com/Ye1ssbcc. Теперь это только 1 канал, а не 3. – user3140607

+0

также попытался ответить на этот вопрос: '$ desc = $ xpath-> query (" // * [содержит (concat ('', normalize-space (@class), ''), 'short-teaser')] «), ни один из них не работает. – user3140607

+0

Помимо кучи предупреждений PHP я не могу воспроизвести вашу проблему - я получаю новости о $ limit. Кстати, лучше перебирать все элементы в '$ feed', но' break' после пунктов $ limit', вы думаете о том, что произойдет, если на сайте есть только два элемента? –

Смежные вопросы