2

Webページからいくつかのテーブルを抽出して、自分のページに表示したい

正規表現を使用してそれらを抽出しようとしましたが、DOMDocumentクラスが表示され、stackoverflowを調べたところ、すべての質問が内部テキストの取得または要素の内部ノードの取得にループを使用することに関するもののようです。IDでhtml要素を抽出して印刷するにはどうすればよいですか。

$html = file_get_contents("www.site.com");
$xml = new DOMDocument();
$xml->loadHTML($html);
$xpath = new DOMXPath($xml);
$table =$xpath->query("//*[@id='myid']");
$table->saveHTML(); // this obviously doesn't work

$ tableを実際のhtmlテーブルとしてページに表示またはエコーするにはどうすればよいですか?

4

2 に答える 2

7

まず、メソッドDOMDocumentがあるgetElementById()ので、XPathは不要です-それがその下でどのように機能するかと思いますが。

次に、ドキュメント全体ではなくマークアップのフラグメントを取得するために、を使用するDOMNode::C41N()ため、コードは次のようになります。

<?php

    // Load the HTML into a DOMDocument
    // Don't forget you could just pass the URL to loadHTML()
    $html = file_get_contents("www.site.com");
    $dom = new DOMDocument('1.0');
    $dom->loadHTML($html);

    // Get the target element
    $element = $dom->getElementById('myid');

    // Get the HTML as a string
    $string = $element->C14N();

実例を参照してください。

于 2012-06-27T12:20:02.937 に答える
1

DOMElement :: C14N()を使用して、DOMElementの正規化されたHTML(XML)表現を取得できます。または、特定の要素と属性をフィルター処理できるようにもう少し制御したい場合は、次のようなものを使用できます。

function toHTML($nodeList, $tagsToStrip=array('script','object','noscript','form','style'),$attributesToSkip=array('on*')) {
$html = '';
foreach($nodeList as $subIndex => $values) {
    if(!in_array(strtolower($values->nodeName), $tagsToStrip)) {
        if(substr($values->nodeName,0,1) != '#') {
            $html .= ' <'.$values->nodeName;
            if($values->attributes) {
                for($i=0;$values->attributes->item($i);$i++) {
                    if( !in_array( strtolower($values->attributes->item($i)->nodeName) , $attributesToSkip ) && (in_array('on*',$attributesToSkip) && substr( strtolower($values->attributes->item($i)->nodeName) ,0 , 2) != 'on') ) {
                        $vvv = $values->attributes->item($i)->nodeValue;
                        if( in_array( strtolower($values->attributes->item($i)->nodeName) , array('src','href') ) ) {
                            $vvv = resolve_href( $this->url , $vvv );
                        }
                        $html .= ' '.$values->attributes->item($i)->nodeName.'="'.$vvv.'"';
                    }
                }
            }
            if(in_array(strtolower($values->nodeName), array('br','img'))) {
                $html .= ' />';
            } else {
                $html .= '> ';
                if(!$values->firstChild) {
                    $html .= htmlspecialchars( $values->textContent , ENT_COMPAT , 'UTF-8' , true );
                } else {
                    $html .= toHTML($values->childNodes,$tagsToStrip,$attributesToSkip);
                }
                $html .= ' </'.$values->nodeName.'> '; 
            }
        } elseif(substr($values->nodeName,1,1) == 't') {
            $inner = htmlspecialchars( $values->textContent , ENT_COMPAT , 'UTF-8' , true );
            $html .= $inner;
        }
    }
}
return $html;
}

echo toHTML($table);
于 2012-06-27T12:35:28.653 に答える