2012-03-16 78 views
0

我有一个PHP DOM对象 http://php.net/manual/en/class.domdocument.php如何使用PHP DOM对象提取一些内容?

难道仅仅可以显示从第三标签,并在该表中的第二个标签内容有问题?

/*** 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 />'; 
} 

编辑:

我得到这个错误:致命错误:在

<?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; 
?> 

EDIT2无法使用类型的DOMNodeList的对象数组:

<?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 />'; 
} 
+0

我在$ HTML变量HTML内容。 – user1273409 2012-03-16 07:24:56

+0

所述第一语法错误,这是因为[],使用 - >项(0),而不是支架 – artragis 2012-03-16 18:53:15

回答

2

我不明白你的问题。用$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 则采取第三 然后 你保持在阵列中第二你把TR元件和第三

$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 
} 
+0

是否有可能使用DOMXpath用foreach? 我需要它来对表中的每个进行foreach。 – user1273409 2012-03-16 08:41:08

+0

我给你的查询返回每个表的每个tr的每第二个和第三个TD。返回值是遍历foreach – artragis 2012-03-16 08:48:25

+0

对不起,但我只需要从一个表中的和​​- 第三个。 – user1273409 2012-03-16 08:55:35

1

您正在尝试在DOMNodeList上使用foreach。这是一个对象而不是数组。你需要使用一个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); 
} 
+0

好的,但其他两个表跳过怎么办? – user1273409 2012-03-16 18:22:40

+0

我更新了它,以显示如何获得第三个表格。如果您打算继续进行PHP开发,我强烈建议您阅读PHP手册(如我在某些地方的答案中所链接的内容)一样舒适。它会帮助你回答很多这类问题。 – Marshmellow1328 2012-03-16 18:41:41

+1

DomNodeList是可遍历的 – artragis 2012-03-16 18:51:53