Pregunta

Soy nuevo en DOM análisis en PHP:
Tengo un archivo HTML que estoy tratando de analizar. Tiene un montón de DIVs como esto:

<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 utilizar el analizador DOM para hacer esto?

Gracias!

¿Fue útil?

Solución

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 un identificador único.

El 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 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 DOMXPath para más detalles.

Otros consejos

Tengo que esto funcione utilizando simplehtmldom como punto de partida:

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

Muy buena 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 />"  

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:

  

utilizar WebExtractor \ DataExtractor \ DataExtractorFactory; utilizar   WebExtractor \ DataExtractor \ DataExtractorTypes; utilizar   WebExtractor \ Client \ Client;

     

$ fábrica = DataExtractorFactory :: getFactory (); $ Extractora =   $ fábrica> createDataExtractor (DataExtractorTypes :: CSS); $ = Nuevo cliente   Cliente; $ Content =   $ Cliente-> get ( ' https://en.wikipedia.org/wiki/2014_Winter_Olympics ' );   $ Extractor-> setContent ($ contenido); $ H1 =   $ Extractor-> setSelector ( 'h1') -> extracto ();

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top