使用domDocument获取src元素

时间:2012-07-21 16:03:07

标签: php domdocument

我正在使用domDocument。我很接近,但最后一点需要帮助

我有这个HTML只是下面的一个片段。 有很多行。我想要获得href。

到目前为止,我正在做以下事情: 我可以把桌子,tr和td搞定,但不知道该怎么做。

感谢您的帮助

foreach ($dom->getElementsByTagName('table') as $tableitem) {
    if ( $tableitem->getAttribute('class') == 'tableStyle02'){
        $rows = $tableitem->getElementsByTagName('tr');
        foreach ($rows as $row){ 
            $cols = $row->getElementsByTagName('td'); 

            $hrefs = $cols->item(0)->getElementsByTagName('a'); 
        }     
    }
}

html片段:

<table width="100%" border="0" cellspacing="0" cellpadding="2" class="tableStyle02"> 
    <tr> 
        <td><span class="Name"><a href="bin.php?cid=703&size=0">
               <strong>Conference Facility</strong></a></span></td>
        <td align="center" nowrap>0.00</td>
        <td align="center">&nbsp;0&nbsp;</td>
        <td align="center">&nbsp;&nbsp;</td>
        <td align="center">&nbsp;0&nbsp;</td>
        <td align="center">&nbsp;0&nbsp;</td>
        <td align="center">&nbsp;0 - 0 &nbsp;</td>
        <td align="center">&nbsp;Wired Internet,&nbsp;&nbsp;&nbsp;</td>
        <td align="center">&nbsp;&nbsp;</td>
    </tr>

3 个答案:

答案 0 :(得分:3)

让我向您介绍xpath的概念,这是DomDocuments的查询语言:

//table[@class="tableStyle02"]//a/@href

读取为:使用类属性tableStyle02获取表标记,然后从子标记中获取href属性。

或者您也有trtd元素的foreach:

//table[@class="tableStyle02"]/tr/td/a/@href

现在在该路径中,a标记是td标记的直接子标记,它是tr标记的直接子标记,它是表标记的直接子标记。正如您所看到的,使用xpath,比在PHP代码中编写所有内容要容易得到元素的路径。

Apropos PHP代码,在PHP中,可以看起来像:

$doc = new DOMDocument();
$doc->loadHTML($html);
$xp = new DOMXPath($doc);
$href = $xp->evaluate('string(//table[@class="tableStyle02"]//a/@href)');

变量$href则包含字符串:bin.php?cid=703&size=0


此示例带有字符串(string(...)),因此->evaluate返回一个字符串,该字符串是从第一个找到的属性节点创建的。相反,您也可以返回节点列表:

$hrefs = $xp->query('//table[@class="tableStyle02"]/tr/td/span/a/@href');
#             ^^^^^                                       ^^^^

现在$hrefs包含通常的DOMNodeList,此处它包含所有href属性节点:

echo $hrefs->item(0)->nodeValue; # bin.php?cid=703&size=0

请注意,如果您只使用一个斜杠/来分隔标签,那么他们需要是直接的孩子。有两个斜杠//它可以是一个后代(孩子的孩子或孩子(孩子的......)...)。

答案 1 :(得分:1)

您应该能够在单个DOMElement实例上使用getAttribute()(就像您在示例的第二行中使用它一样):

foreach ($hrefs as $a_node) {
    if ($a_node->hasAttribute('href')) {
        print $a_node->getAttribute('href');
    }
}

答案 2 :(得分:1)

您不必沿着DOM层次结构导航以使用getElementsByTagName

foreach ($dom->getElementsByTagName('table') as $tableitem) {
    if ($tableitem->getAttribute('class') == 'tableStyle02'){
        $links = $tableitem->getElementsByTagName("a");
    }
}
此时

$links现在是DOMNodeList,因此您可以遍历它:

foreach ($dom->getElementsByTagName('table') as $tableitem) {
    if ($tableitem->getAttribute('class') == 'tableStyle02'){
        $links = $tableitem->getElementsByTagName("a");
        $hrefs = array();
        foreach ($links as $link) {
            $hrefs[] = $link->getAttribute("href");
        }
    }
}
// Do things with $hrefs