Пример HTML …
<html> <head></head> <body> <table> <tr> <td class="rsheader"><b>Header Content</b></td> </tr> <tr> <td class="rstext">Some text (Most likely will contain lots of HTML</td> </tr> </table> </body> </html>
Мне нужно преобразовать страницу HTML в шаблонную версию этой HTML-страницы. HTML-страница состоит из нескольких блоков, каждый из которых имеет заголовок (в приведенном выше коде как «rsheader») и некоторый текст (в приведенном выше коде как «rstext»).
Я пытаюсь написать PHP-скрипт для извлечения HTML-страницы, возможно, используя file_get_contents, а затем для извлечения любого содержимого внутри разделов rsheader и rstext. В основном я не знаю, как это сделать! Я пробовал экспериментировать с DOM, но я не слишком хорошо это знаю, и хотя мне удалось извлечь текст, он проигнорировал любой HTML.
Мой PHP …
<?php $html = '<html> <head></head> <body> <table> <tr> <td class="rsheader"><b>Header Content</b></td> </tr> <tr> <td class="rstext">Some text (Most likely will contain lots of HTML</td> </tr> </table> </body> </html>'; $dom = new DomDocument(); $dom->loadHtml($html); $xpath = new DomXpath($dom); $div = $xpath->query('//*[@class="rsheader"]')->item(0); echo $div->textContent; ?>
Если я делаю print_r ($ div), я вижу это …
DOMElement Object ( [tagName] => td [schemaTypeInfo] => [nodeName] => td [nodeValue] => Header Content [nodeType] => 1 [parentNode] => (object value omitted) [childNodes] => (object value omitted) [firstChild] => (object value omitted) [lastChild] => (object value omitted) [previousSibling] => [nextSibling] => (object value omitted) [attributes] => (object value omitted) [ownerDocument] => (object value omitted) [namespaceURI] => [prefix] => [localName] => td [baseURI] => [textContent] => Header Content )
Как вы можете видеть, в узле textContent нет HTML-тегов, из-за чего мне кажется, что я ошибаюсь 🙁
Надеюсь, кто-то сможет мне помочь …
заранее спасибо
Павел
X-Path, вероятно, немного больше кувалды, чем вам нужно для этой задачи. Вместо этого я попытался бы использовать метод getElementById () DOMDocument. Ниже приведен пример, который был адаптирован из этой публикации .
ПРИМЕЧАНИЕ. Обновлено для использования имен тегов и классов вместо идентификаторов элементов.
function getChildHtml( $node ) { $innerHtml= ''; $children = $node->childNodes; foreach( $children as $child ) { $innerHtml .= sprintf( '%s%s', $innerHtml, $child->ownerDocument->saveXML( $child ) ); } return $innerHtml; } $dom = new DomDocument(); $dom->loadHtml( $html ); // Gather all table cells in the document. $cells = $dom->getElementsByTagName( 'td' ); // Loop through the collected table cells looking for those of class 'rsheader' or 'rstext'. foreach( $cells as $cell ) { if( $cell->getAttribute( 'class' ) == 'rsheader' ) { $headerHtml = getChildHtml( $cell ); // Do something with header html. } if( $cell->getAttribute( 'class' ) == 'rstext' ) { $textHtml = getChildHtml( $cell ); // Do something with text html. } }
Посмотрите на этот ответ и используйте его в качестве ориентира: получение определенных данных с веб-сайта
Если вам нужна подробная помощь, я здесь, чтобы помочь.