0

我正在使用php,并且DOMDocument

我需要做的是让所有href这些<a>都在<h2>标签内

在有类似列表的页面上

<h2><a href="blablabla">The title</a></h2>

<a>每个中只有一个<h2>

我设法实现的是:

  1. 通过加载文档:loadfromhtml(此项目需要)
  2. <h2>在文档中获取
  3. 得到那些<h2>->nodeValue (caption of url)

所以我的问题是,当我尝试getElementsByTagName('a')<h2>节点(#2)上做同样的事情时,php 挂起(不再产生输出,页面加载停止)

我哪里做错了?感谢帮助,谢谢。

4

1 回答 1

1

对我来说很好,例如

<?php
$doc = new DOMDocument;
$doc->loadhtml(data());

foreach( $doc->getElementsByTagName('h2') as $h2 ) {
    foreach( $h2->getElementsByTagName('a') as $a ) {
        echo $a->getAttribute('href'), ': ', $a->nodeValue, "\n";
    }
}

function data() {
    return <<< eoh
<html>
    <head><title>...</title></head>
    <body>
        <h2><a href="link1">header 1</a></h2>
        <p>yadda yadda</p>
        <h2><a href="link2">header 2</a></h2>
        <p>yadda yadda</p>
        <h2><a href="link3">header 3</a></h2>
        <p>yadda yadda</p>
    </body>
</html>
eoh;
}

但我发现为此使用XPath更容易,
例如

<?php
$doc = new DOMDocument;
$doc->loadhtml(data());
$xpath = new DOMXPath($doc);

foreach( $xpath->query('/html/body//h2/a') as $a) {
    echo $a->getAttribute('href'), ": ", $a->nodeValue, "\n";
}

function data() {
    return <<< eoh
<html>
    <head><title>...</title></head>
    <body>
        <h2><a href="link1">header 1</a></h2>
        <p>yadda yadda</p>
        <h2><a href="link2">header 2</a></h2>
        <p>yadda yadda</p>
        <h2><a href="link3">header 3</a></h2>
        <p>yadda yadda</p>
    </body>
</html>
eoh;
}

印刷

link1: header 1
link2: header 2
link3: header 3
于 2012-11-16T14:12:36.673 回答