1

最初の div 要素の最初の a 要素の nodeValue と href をプッシュしたいというループがあります。私はDOMが初めてなので、いくつかの投稿を読んで、次のコードを思いつきました。残念ながら、これは機能していません。誰かがそれで私を助けてくれることを願っています。返信ありがとうございます。乾杯。マルク

以下は $value の html 構造です ($value とは何かを理解するには、以下のループを参照してください)。

    <body>
        <div>
           <a href="myhreflink">this is my target</a>
           <a href="somehref">sometext</a>
        </div>

        <div></div>
        <div></div>
        <div></div>
    </body>

ここで私のループの下:

 myarray = array();  
 /* $content is a DOMNodeList Object and $value is a DOMElement Object */

foreach ($content as $value){

    $firstDiv = $value->getElementsByTagName('div')[0];
    $firstA = $firstDiv->getElementsByTagName('a')[0];

    $val = $firstA->nodeValue;
    $link = $firstA->getAttribute('href');

    array_push($myarray, array('val'=>$val, 'href'=>$link));    
}

-> 完全なコードの下に----------

<?php
header('Content-Type: text/html; charset=utf-8');
mysql_set_charset('utf8'); 
ini_set('display_errors', 1); error_reporting(E_ALL);

$liste = array();


    $url = 'myurl';
    $path = 'mypath'; 
    $titres = print_url_data($url, $path);

    foreach($titres as $value){
        array_push($liste, $value);
    }




// -> functions ------------------------------------------------------------

function print_url_data($url, $path){
    $content = get_url_data($url, $path);
    $tableau = array();
    foreach ($content as $value){

        $firstDiv = $value->getElementsByTagName('div')->item(0);
        $firstA = $firstDiv->getElementsByTagName('a')->item(0);

        $val = $firstA->nodeValue;
        $link = $firstA->getAttribute('href');

        array_push($myarray, array('val'=>$val, 'href'=>$link));  
    }
    return $tableau;
}

function get_url_data($url, $path){
    $xml_content = get_url($url);
    $dom = new DOMDocument();
    @$dom->loadHTML($xml_content);
    $xpath = new DomXPath($dom);
    $content_title = $xpath->query($path);
    return $content_title;
}

function get_url($url){

    $curl = curl_init();

    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: "; // browsers keep this blank.

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_REFERER, '[url=http://www.google.com]http://www.google.com[/url]');
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);


    $html = curl_exec($curl); 
    curl_close($curl);
    return $html; 
}

?>
4

1 に答える 1

2

このタイプの配列逆参照は、真新しい PHP 5.4 より前の PHP では有効ではありません。

// Can't do this unless running PHP5.4 (which seems unlikely)
// Actually without a way to test, I'm not sure that DOMDocument would even
// suppor this under PHP5.4
$firstDiv = $value->getElementsByTagName('div')[0];
$firstA = $firstDiv->getElementsByTagName('a')[0];

代わりに、 を使用してインデックスで値を保存してから取得する必要がありますitem()

$firstDiv = $value->getElementsByTagName('div')->item(0);
$firstA = $firstDiv->getElementsByTagName('a')->item(0);

アップデート

私は今それを手に入れたと思います-それはNodeListなので、代わりに$contentそれを繰り返し処理したくないので、直接呼び出してください。それを繰り返すことで、ノードリストではなく個々のノードを取得し、私が認識している個々のノードを呼び出すことはできません。foreachgetElementsByTagName()getElementsByTagName()

function print_url_data($url, $path){
    $content = get_url_data($url, $path);
    $tableau = array();

    // No need to loop. get nodes directly from $content   
    $firstDiv = $content->getElementsByTagName('div')->item(0);
    $firstA = $firstDiv->getElementsByTagName('a')->item(0);

    $val = $firstA->nodeValue;
    $link = $firstA->getAttribute('href');

    // this is not going to work since $myarray isn't initialized
    // you might have meant to use $tableau
    array_push($myarray, array('val'=>$val, 'href'=>$link));  

    return $tableau;
}
于 2012-04-11T14:51:01.473 に答える