使用 DOMDocument 遍历 DOM 时出现问题
Problem with iterating throught DOM using DOMDocument
我有html这样的结构:
<div id="info">
<h1>Some text</h1>
</div>
<div class="box_con">
<div id="list">
<dl>
<dt>《Library of Heaven“s Path》 Volume 1</dt>
<dd> <a style="" href="1300359.html">1 Swindler</a></dd>
</dl>
</div>
</div>
这是我的代码:
$doc = new DOMDocument;
@$doc->loadHTMLFile($url);
$volume_titles = [];
$title = $doc->getElementById('info')->childNodes->item(1)->nodeValue;
$volume_list = $doc->getElementById('list')->getElementsByTagName('dl');
而且我不知道如何迭代这个 dl
元素来检索 <a>
href 和内容。我已经尝试了很多循环。
$el = $volume_list->firstChild;
do {
var_dump($el);
} while ($el = $el->nextSibling);
$length = $volume_list->length;
for ($i = 0; $i < $length; $i++) {
$node = $volume_list->childNodes->item($i);
var_dump($node);
die();
}
foreach ($volume_list->childNodes as $volume) {
//var_dump($volume_list->getElementsByTagName('dd')->item(0)->nodeValue);
var_dump($volume);
die();
}
但没有任何效果
我认为主要问题是当您使用 getElementsByTagName()
时,这个 returns 节点列表(实际上是 DOMNodeList
)。因此,当您想要访问(例如)该标签的第一项时,您将需要引用数组中的第一项。
如果您扩展初始代码以获取嵌套的标签元素,您可能会得到以下代码,该代码始终在 getElementsByTagName()
的结果上使用 [0]
来挑选第一项.
$title = $doc->getElementById('info')->childNodes->item(1)->nodeValue;
$volume_list = $doc->getElementById('list')->getElementsByTagName('dl');
$a = $volume_list[0]->getElementsByTagName('dd')[0]->getElementsByTagName('a');
echo $a[0]->getAttribute('href');
我有html这样的结构:
<div id="info">
<h1>Some text</h1>
</div>
<div class="box_con">
<div id="list">
<dl>
<dt>《Library of Heaven“s Path》 Volume 1</dt>
<dd> <a style="" href="1300359.html">1 Swindler</a></dd>
</dl>
</div>
</div>
这是我的代码:
$doc = new DOMDocument;
@$doc->loadHTMLFile($url);
$volume_titles = [];
$title = $doc->getElementById('info')->childNodes->item(1)->nodeValue;
$volume_list = $doc->getElementById('list')->getElementsByTagName('dl');
而且我不知道如何迭代这个 dl
元素来检索 <a>
href 和内容。我已经尝试了很多循环。
$el = $volume_list->firstChild;
do {
var_dump($el);
} while ($el = $el->nextSibling);
$length = $volume_list->length;
for ($i = 0; $i < $length; $i++) {
$node = $volume_list->childNodes->item($i);
var_dump($node);
die();
}
foreach ($volume_list->childNodes as $volume) {
//var_dump($volume_list->getElementsByTagName('dd')->item(0)->nodeValue);
var_dump($volume);
die();
}
但没有任何效果
我认为主要问题是当您使用 getElementsByTagName()
时,这个 returns 节点列表(实际上是 DOMNodeList
)。因此,当您想要访问(例如)该标签的第一项时,您将需要引用数组中的第一项。
如果您扩展初始代码以获取嵌套的标签元素,您可能会得到以下代码,该代码始终在 getElementsByTagName()
的结果上使用 [0]
来挑选第一项.
$title = $doc->getElementById('info')->childNodes->item(1)->nodeValue;
$volume_list = $doc->getElementById('list')->getElementsByTagName('dl');
$a = $volume_list[0]->getElementsByTagName('dd')[0]->getElementsByTagName('a');
echo $a[0]->getAttribute('href');