我正在使用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"> 0 </td>
<td align="center"> </td>
<td align="center"> 0 </td>
<td align="center"> 0 </td>
<td align="center"> 0 - 0 </td>
<td align="center"> Wired Internet, </td>
<td align="center"> </td>
</tr>
答案 0 :(得分:3)
让我向您介绍xpath的概念,这是DomDocuments的查询语言:
//table[@class="tableStyle02"]//a/@href
读取为:使用类属性tableStyle02获取表标记,然后从子标记中获取href属性。
或者您也有tr
和td
元素的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