0

PHP を使用して DOM ドキュメント ツリーを編集しようとしています。しかし、私は立ち往生しています。HTML を読み込んだ後、指定したいくつかの要素を除いて、すべての要素を削除したいと考えています。(<p>および<b>、たとえば) どうすればこれを行うことができますか? それは可能ですか?

以下は私の現在のコードです:

<?php
$url = 'http://en.wikipedia.org/w/index.php?title=Elephant&action=render';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

$html = '<html>' . curl_exec($curl) . '</html>';
echo $html;

$document = new DOMDocument;
$document->loadHTML($html);

$allowed_elements = array(
    'a',
    'b',
    'i',
    'p',
);

$parent = $document->getElementsByTagName('html')->item(0);

foreach ($parent->getElementsByTagName('*') as $element)
{
    $node = strtolower((string)$element->nodeName);
    if (!in_array($node, $allowed_elements))
    {
        $element->parentNode->removeChild($element);
    }
}

echo $document->saveHTML();

curl_close($curl);
?>

私の試行錯誤の結果、DOM ツリーをループできることがわかったので、単にループできると思います。しかし、私のコードはまだ機能していません! 私は最終的にプレーンテキストのウィキペディアの記事を取得しようとしています.誰かが私が自分で書く必要のない代替ツールを知っていれば、それは受け入れられる答えになるでしょう.

ありがとう!!:)

4

1 に答える 1

3

これを試して:

<?php
$url = 'http://en.wikipedia.org/w/index.php?title=Elephant&action=render';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

$html = '<html>' . curl_exec($curl) . '</html>';
curl_close($curl);

$document = new DOMDocument('1.0');
$document->loadHTML($html);

$allowed_elements = array('a','b','i','p');
$elems = array();

$parent = $document->getElementsByTagName('html')->item(0);

foreach ($parent->getElementsByTagName('*') as $element)
{
    $node = (string)$element->nodeName;
    if(strtolower($node) == 'body'){
        continue;
    }

    $elems[] = $node;
}

$elems = array_values( array_unique( $elems ) );
$elems = array_diff( $elems, $allowed_elements );
$elems = array_values( array_unique( $elems ) );
sort($elems);

foreach( $elems as $elem ) {
    $parent1 = $parent->getElementsByTagName($elem);
    $length = $parent->getElementsByTagName($elem)->length;

    for($i=0;$i<$length;$i++) {
        $el = $parent1->item(0); // 0 is the index because after each `removeChild`, the next element shifts 1 position back.
        if( $el ) {
            $el->parentNode->removeChild($el);
        }
    }
}

echo $document->saveHTML();
?>

$elementsToKeep - 削除されないアイテムのリストを含む配列。

お役に立てれば。

于 2012-05-24T08:10:26.367 に答える