1

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

我有这个 html 只是下面的一个片段。有许多行。我正在尝试获取href。

到目前为止,我正在做以下事情:我可以得到 table、tr 和 td ok,但不知道从那里做什么。

谢谢你的帮助

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>
4

3 回答 3

3

让我向您介绍 xpath 的概念,一种用于 DomDocuments 的查询语言:

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

读作:获取具有类属性 tableStyle02 的 table 标记,然后是子标记中的 href 属性。

或者你也有 foreachtrtd元素:

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

现在在该路径中,a 标签是 td 标签的直接子标签,它是 tr 标签的直接子标签,它是 table 标签的直接子标签。如您所见,使用 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

请注意,如果您只使用一个斜杠/来分隔标签,则它们必须是直接子代。使用两个斜杠//,它可以是后代(child or child of child (of child (of ...)))。

于 2012-07-21T16:12:03.097 回答
1

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

foreach ($hrefs as $a_node) {
    if ($a_node->hasAttribute('href')) {
        print $a_node->getAttribute('href');
    }
}
于 2012-07-21T16:10:33.040 回答
1

您不必在 DOM 层次结构中向下导航即可使用getElementsByTagName

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

$links此时现在是 a 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
于 2012-07-21T16:11:34.800 回答