2009-06-06 5 views
12

Sono nuovo al parsing DOM in PHP:
Ho un file HTML che sto cercando di analizzare. Ha un sacco di div in questo modo:come utilizzare dom parsp php

<div id="interestingbox"> 
    <div id="interestingdetails" class="txtnormal"> 
     <div>Content1</div> 
     <div>Content2</div> 
    </div> 
</div> 

<div id="interestingbox"> 
...... 

Sto cercando di ottenere il contenuto delle molte caselle div utilizzando PHP. Come posso usare il parser DOM per fare questo?

Grazie!

risposta

20

Prima di tutto devo dire che non è possibile utilizzare lo stesso ID su due div differenti; ci sono classi per quel punto. Ogni elemento dovrebbe avere un ID unico.

codice per ottenere il contenuto del div con id = "interestingbox"

$html = ' 
<html> 
<head></head> 
<body> 
<div id="interestingbox"> 
    <div id="interestingdetails" class="txtnormal"> 
     <div>Content1</div> 
     <div>Content2</div> 
    </div> 
</div> 

<div id="interestingbox2"><a href="#">a link</a></div> 
</body> 
</html>'; 


$dom_document = new DOMDocument(); 

$dom_document->loadHTML($html); 

//use DOMXpath to navigate the html with the DOM 
$dom_xpath = new DOMXpath($dom_document); 

// if you want to get the div with id=interestingbox 
$elements = $dom_xpath->query("*/div[@id='interestingbox']"); 

if (!is_null($elements)) { 

    foreach ($elements as $element) { 
    echo "\n[". $element->nodeName. "]"; 

    $nodes = $element->childNodes; 
    foreach ($nodes as $node) { 
     echo $node->nodeValue. "\n"; 
    } 

    } 
} 

//OUTPUT 
[div] { 
     Content1 
     Content2 
} 

Esempio con le classi:

$html = ' 
<html> 
<head></head> 
<body> 
<div class="interestingbox"> 
    <div id="interestingdetails" class="txtnormal"> 
     <div>Content1</div> 
     <div>Content2</div> 
    </div> 
</div> 

<div class="interestingbox"><a href="#">a link</a></div> 
</body> 
</html>'; 

//the same as before.. just change the xpath 

[...] 

$elements = $dom_xpath->query("*/div[@class='interestingbox']"); 

[...] 

//OUTPUT 
[div] { 
     Content1 
     Content2 
} 

[div] { 
a link 
} 

riferimento alla pagina DOMXPath per maggiori dettagli.

6

ho avuto questo lavoro utilizzando simplehtmldom come inizio:

$html = file_get_html('example.com'); 
foreach ($html->find('div[id=interestingbox]') as $result) 
{ 
    echo $result->innertext; 
} 
+0

questo è molto facile da usare –

0

Bellissima funzione dalla http://www.sitepoint.com/forums/showthread.php?611393-php5-need-something-like-innerHTML-instead-of-nodeValue

function innerXML($node) 

{ 

    $doc = $node->ownerDocument; 

    $frag = $doc->createDocumentFragment(); 

    foreach ($node->childNodes as $child) 

    { 

     $frag->appendChild($child->cloneNode(TRUE)); 

    } 

    return $doc->saveXML($frag); 

} 


$dom = new DOMDocument(); 

$dom->loadXML(' 

<html> 

<body> 

<table> 

<tr> 

    <td id="foo"> 

     The first bit of Data I want 

     <br />The second bit of Data I want 

     <br />The third bit of Data I want 

    </td> 

</tr> 

</table> 

<body> 

<html> 



'); 

$xpath = new DOMXPath($dom); 

$node = $xpath->evaluate("/html/body//td[@id='foo' ]"); 

$dataString = innerXML($node->item(0)); 
$dataArr = explode("<br />", $dataString); 

$dataUno = $dataArr[0]; 
$dataDos = $dataArr[1]; 
$dataTres = $dataArr[2]; 

echo "firstdata = $nameUno<br />seconddata = $nameDos<br />thirddata = $nameTres<br />" 
0

WebExtractor: https://github.com/knyga/webextractor E 'in grado di analizzare la pagina con i CSS, regex, selettori XPath.

pacchetto Look and test per gli esempi:

uso WebExtractor \ DataExtractor \ DataExtractorFactory; utilizzare WebExtractor \ DataExtractor \ DataExtractorTypes; utilizzare WebExtractor \ Client \ Client;

$ factory = DataExtractorFactory :: getFactory(); $ extractor = $ factory-> createDataExtractor (DataExtractorTypes :: CSS); $ client = new Client; $ content = $ client-> get ('https://en.wikipedia.org/wiki/2014_Winter_Olympics'); $ extractor-> setContent ($ content); $ h1 = $ extractor-> setSelector ('h1') -> extract();