2009-06-06 15 views
12

Jestem nowy do parsowania DOM w PHP:
Mam plik HTML, który próbuję analizować. Ma wiele takich DIV:jak korzystać z parse php domena

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

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

Próbuję uzyskać zawartość wielu pól DIV za pomocą php. Jak mogę użyć parsera DOM, aby to zrobić?

Dzięki!

Odpowiedz

20

najpierw muszę ci powiedzieć, że nie można używać tego samego identyfikatora na dwóch różnych div; istnieją klasy dla tego punktu. Każdy element powinien mieć unikalny identyfikator.

kod aby otrzymać zawartość div 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 
} 

Przykład z klas:

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

Patrz strona DOMXPath więcej szczegółów.

6

Dostałem to do pracy za pomocą simplehtmldom jako początek:

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

jest to bardzo łatwy w użyciu –

0

Bardzo ładny funkcja z 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 Można analizować stronę z CSS, regex, selektorów XPath.

Pakiet Look i testy na przykładach:

użycie WebExtractor \ DataExtractor \ DataExtractorFactory; użyj WebExtractor \ DataExtractor \ DataExtractorTypes; użyj WebExtractor \ Client \ Client;

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