2009-06-06 16 views
12

Soy nuevo en el análisis DOM en PHP:
Tengo un archivo HTML que estoy tratando de analizar. Tiene un montón de DIVs así:cómo usar el analizador dom php

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

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

Estoy tratando de obtener el contenido de las muchas cajas div utilizando php. ¿Cómo puedo usar el analizador DOM para hacer esto?

Gracias!

Respuesta

20

En primer lugar tengo que decir que no se puede utilizar el mismo ID en dos divs diferentes; hay clases para ese punto. Cada elemento debe tener una identificación única.

código para obtener el contenido 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 
} 

Ejemplo con las clases:

$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 
} 

consulte la página de DOMXPath para más detalles.

6

Tengo esto para trabajar utilizando simplehtmldom como punto de partida:

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

esto es muy fácil de usar –

0

Muy bonito función de 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 Se puede analizar la página con CSS, expresiones regulares, selectores XPath.

paquete de apariencia y pruebas para ver ejemplos:

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

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

Cuestiones relacionadas