Как извлечь некоторый контент с помощью PHP DOM OBJECT? - PullRequest
0 голосов
/ 16 марта 2012

У меня проблема с DOM-объектом php http://php.net/manual/en/class.domdocument.php

Можно ли отображать только содержимое третьего тега и второго тега в этой таблице?

/*** a new dom object ***/ 
$dom = new domDocument; 

/*** load the html into the object ***/ 
@$dom->loadHTML($html); 

/*** discard white space ***/ 
$dom->preserveWhiteSpace = false; 

/*** the table by its tag name ***/ 
$tables = $dom->getElementsByTagName('table'); 

/*** get all rows from the table ***/ 
$rows = $tables->item(0)->getElementsByTagName('tr'); 

/*** loop over the table rows ***/ 
foreach ($rows as $row) 
{ 
    /*** get each column by tag name ***/ 
    $cols = $row->getElementsByTagName('td'); 

    /*** echo the values ***/ 
    echo $cols->item(0)->nodeValue.'<br />'; 
    echo $cols->item(1)->nodeValue.'<br />'; 
    echo $cols->item(2)->nodeValue.'<br />'; 
    echo $cols->item(3)->nodeValue.'<br />';
    echo $cols->item(4)->nodeValue.'<br />';
    echo $cols->item(5)->nodeValue.'<br />';
    echo '<hr />'; 
} 

РЕДАКТИРОВАТЬ:

Я получаю эту ошибку: Неустранимая ошибка: невозможно использовать объект типа DOMNodeList в качестве массива в

<?php

/*** a new dom object ***/ 
$dom = new domDocument; 

/*** load the html into the object ***/ 
@$dom->loadHTML('content.html'); 

/*** discard white space ***/ 
$dom->preserveWhiteSpace = false; 

$xpath = new DOMXPath($dom);

$selected = $xpath->query('//table/tr/td[first()+1]');
echo $selected[0]->nodeValue;
?>

Редактировать2:

<?php

$output = file_get_contents('test.php');

/*** a new dom object ***/ 
$dom = new domDocument; 

/*** load the html into the object ***/ 
@$dom->loadHTML($output); 

/*** discard white space ***/ 
$dom->preserveWhiteSpace = false; 

/*** the table by its tag name ***/ 
$tables = $dom->getElementsByTagName('table');//get all the tables

if($tables->length > 2) { //check there are more than 2

    $thirdTable = $tables->item(2);

    $cols = $thirdTable->getElementsByTagName('td'); 

    /*** echo the values ***/ 
    echo $cols->item(0)->nodeValue.'<br />'; 
    echo $cols->item(1)->nodeValue.'<br />'; 
    echo $cols->item(2)->nodeValue.'<br />'; 
    echo $cols->item(3)->nodeValue.'<br />';
    echo $cols->item(4)->nodeValue.'<br />';
    echo $cols->item(5)->nodeValue.'<br />';
    echo '<hr />'; 
}

?>

EDIT3 - этот код отображает только содержимое третьего тега таблицы.Но это также нужно только для отображения содержимого из второго тега tr в третьей таблице.

$html = file_get_contents('content.html');

/*** a new dom object ***/ 
$dom = new domDocument; 

/*** load the html into the object ***/ 
@$dom->loadHTML($html); 

/*** discard white space ***/ 
$dom->preserveWhiteSpace = false; 

/*** the table by its tag name ***/ 
$tables = $dom->getElementsByTagName('table'); 

/*** get all rows from the table ***/ 
$rows = $tables->item(2)->getElementsByTagName('tr')->item(1); 

/*** loop over the table rows ***/ 
foreach ($rows as $row) 
{ 
    /*** get each column by tag name ***/ 
    $cols = $row->getElementsByTagName('td'); 

    /*** echo the values ***/ 
    echo $cols->item(0)->nodeValue.'<br />'; 
    echo $cols->item(1)->nodeValue.'<br />'; 
    echo $cols->item(2)->nodeValue.'<br />'; 
    echo $cols->item(3)->nodeValue.'<br />';
    echo $cols->item(4)->nodeValue.'<br />';
    echo $cols->item(5)->nodeValue.'<br />';
    echo '<hr />'; 
}

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Я не понимаю твою проблему.С $cols->item(2) вы получите второй DOME-элемент, который вам нужен.

Если вы просто хотите первый (или второй ...), вы можете использовать XPath

$xpath = new DOMXpath($document);
$selected = $xpath->query('//table/tr/td[first()+1] | //table/tr/td[first()+2]');
echo $selected[0]->nodeValue;

Если вы не хотитечтобы использовать DOMXPath, вы можете остаться с вашим getElementsByTagName. Сначала вы получаете все таблицы, затем проверяете, что их больше 2, затем берете третий, затем второй элемент, который вы храните в массиве, и третий

$tables = $dom->getElementsByTagName('table');//get all the tables
if($tables->length > 2){//check there are more than 2
    $thirdTable = $tables->item(2);
    //get the tr then td
}
1 голос
/ 16 марта 2012

Вы пытаетесь использовать foreach в DOMNodeList . Это объект, а не массив. Вам нужно использовать for loop , чтобы перебрать его так:

$tables = $dom->getElementsByTagName('table');
if( $tables->length < 3 ) {
  // Ahh crap! There is no third table!
}
$thirdTable = $tables->item(2);
$rows = $thirdTable->getElementsByTagName('tr');
for( $i = 0; $i < $rows->length; $i++ ) {
  $row = $rows->item( $i );
  $cols = $row->getElementsByTagName('td');
  $secondTd = $row->item( 1 );
  $thirdTd = $row->item( 2 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...