Я использую DOM для получения содержимого тега div, но внутренняя часть html не показана. Функция:
$dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTMLFile("$url"); libxml_use_internal_errors(false); $xpath = new DOMXPath($dom); $divTag = $xpath->query('//div[@id="post"]'); foreach ($divTag as $val) { echo $val->getAttribute('title') . ' - ' . $val->nodeValue . "<br />\n"; }
если источник страницы (только для Div)
<div id="post">Some text <img src="..." /> <table>some codes</table></div>
то функция возвращает только
"Some text "
но я хочу получить все HTML-элементы, например:
Some text <img src="..." /> <table>some codes</table>
Есть ли способ сделать это? Спасибо, прямо сейчас.
Если вы ищете DOMDocument версию innerHTML
в браузере DOM, ближайший – saveXML
.
echo $dom->saveXML(val).'<br />\n';
(Помните о htmlspecialchars, если вы хотите, чтобы это действительно отображалось как текст.)
outerHTML
менее это дает вам outerHTML
. Если вам действительно нужен innerHTML
, вам нужно будет пропустить каждый из дочерних узлов элемента и передать их в saveXML
, а затем их saveXML
.
И это только сериализация XML: нет соответствующей версии HTML. saveHTML
существует, но может сохранить только весь документ сразу, к сожалению. Если важно, чтобы вы получили устаревший HTML-код, вы можете уйти от него, передав параметр LIBXML_NOEMPTYTAG
чтобы убедиться, что раздражающие пустые теги, такие как <script src="..."></script>
, не разбиваются браузера.
попробуйте удалить «//» из вашего запроса Xpath …
это говорит парсеру XPath, чтобы затем получить все дочерние узлы … которые ваши HTML-теги …
Ссылка: http://www.w3schools.com/XPath/xpath_syntax.asp
РЕДАКТИРОВАТЬ:
Также проверьте XPath Axes: http://www.w3schools.com/xpath/xpath_axes.asp
В основном, что сказал bobince, но я добавляю, что вы можете использовать буферизацию вывода, чтобы получить содержимое, если вы сделаете это в php, не показывая его в html.
$divTag = $xpath->query('//div[@id="post"]'); ob_start(); foreach ($divTag as $val) { echo $dom->saveXML($val); } $content = ob_get_clean();