Я новичок в разборе DOM в PHP:
У меня есть файл HTML, который я пытаюсь проанализировать. У этого есть куча DIVs, как это:
<div id="interestingbox"> <div id="interestingdetails" class="txtnormal"> <div>Content1</div> <div>Content2</div> </div> </div> <div id="interestingbox"> ......
Я пытаюсь получить содержимое многих полей div, используя php. Как я могу использовать парсер DOM для этого?
Благодаря!
Сначала я должен сказать вам, что вы не можете использовать один и тот же идентификатор на двух разных div; для этого есть классы. Каждый элемент должен иметь уникальный идентификатор.
Код для получения содержимого 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 }
Пример с классами:
$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 }
Более подробную информацию см. На странице DOMXPath .
Я получил это, чтобы работать с использованием simplehtmldom в начале:
$html = file_get_html('example.com'); foreach ($html->find('div[id=interestingbox]') as $result) { echo $result->innertext; }
Очень хорошая функция от 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. Он может анализировать страницу с помощью селекторов css, regex, xpath.
Посмотрите пакет и тесты для примеров:
использовать WebExtractor \ DataExtractor \ DataExtractorFactory; использовать WebExtractor \ DataExtractor \ DataExtractorTypes; использовать WebExtractor \ Client \ Client;
$ factory = DataExtractorFactory :: getFactory (); $ extractor = $ factory-> createDataExtractor (DataExtractorTypes :: CSS); $ client = новый клиент; $ content = $ client-> get (' https://en.wikipedia.org/wiki/2014_Winter_Olympics '); $ Extractor-> setContent ($ содержание); $ h1 = $ extractor-> setSelector ('h1') -> extract ();