Привет, я загружаю контент из внешнего url. что-то вроде этого.
$html=get_data($external_url);
где get_data () – это функция для получения контента с использованием curl.
теперь после этого я хочу получить внутренний html из разных html-элементов, таких как h1, div, p, span, используя их класс или id.
например, если содержимое из внешнего url ($ html) является чем-то вроде этого.
<html> <title></title> <body> <h1 class="title">I am title</h1> <div id="content"> i am the content. </div> </body>
теперь я хочу получить внутренний html тега html с классом = "title". Аналогично, я хочу получить внутренний html тега с id = "content"
Как это сделать, используя php? Я не знаю о DOM, XML. пожалуйста помоги.
Вот функция DOMDocument::saveHTML()
. В текущих версиях php это может занять узел, который вы хотите сохранить как html. Чтобы сохранить внутренний html узла, вам необходимо сохранить каждый дочерний узел.
function getHtml($nodes) { $result = ''; foreach ($nodes as $node) { $result .= $node->ownerDocument->saveHtml($node); } return $result; }
Чтобы получить узлы, вы можете использовать Xpath. Идентификатор легко.
Получить все узлы элементов:
//*
которые имеют атрибут id "content"
//*[@id="content"]
Используйте только первый найденный узел, если кто-то добавил один и тот же идентификатор несколько раз.
//*[@id="content"][1]
Получить дочерние узлы – node () включает элемент, текст и несколько других узлов
//*[@id="content"][1]/node()
$dom = new DOMDocument(); $dom->loadHTML($html); $xpath = new DOMXpath($dom); echo getHtml($xpath->evaluate('//*[@id="content"][1]/node()'));
Атрибут класса немного сложнее. Атрибуты класса – это списки токенов, они могут содержать несколько имен классов. Вот трюк для их соответствия. Функция Xpath normalize-space () преобразует все группы пробелов в разделители одного пробела. Добавьте пространство впереди и до конца, и вы получите строку типа " one two three "
. Теперь вы можете проверить, является ли " one "
частью этой строки. В Xpath:
Нормализовать атрибут класса:
normalize-space(@class)
Добавить пробелы для начала и конца:
concat(" ", normalize-space(@class), " ")
Проверьте, содержит ли она подстроку
contains(concat(" ", normalize-space(@class), " "), " title ")
Используйте его для ограничения узлов
//*[contains(concat(" ", normalize-space(@class), " "), " title ")][1]/node()
Составлено:
$html = <<<'HTML' <html> <title></title> <body> <h1 class="title">I am title</h1> <div id="content"> i am the <b>content</b>. </div> </body> HTML; $dom = new DOMDocument(); $dom->loadHTML($html); $xpath = new DOMXpath($dom); function getHtml($nodes) { $result = ''; foreach ($nodes as $node) { $result .= $node->ownerDocument->saveHtml($node); } return $result; } // first node with the id var_dump( getHtml( $xpath->evaluate('//*[@id="content"][1]/node()') ) ); // first node with the class var_dump( getHtml( $xpath->evaluate( '//*[contains(concat(" ", normalize-space(@class), " "), " title ")][1]/node()' ) ) ); // alternative - handling multiple nodes with the same class in a loop $nodes = $xpath->evaluate( '//*[contains(concat(" ", normalize-space(@class), " "), " title ")]' ); foreach ($nodes as $node) { var_dump(getHtml($xpath->evaluate('node()', $node))); }
Выход: https://eval.in/118248
string(40) " i am the <b>content</b>. " string(10) "I am title" string(10) "I am title"
Это просто. Пытаться
$dom_doc = new DomDocument(); $dom_doc->loadHTML($returned_external_html); $element = $dom_doc->getElementsByTagName('table'); // you can search for any tags like <img>, <p> and etc. This will return a DOMNodeList $element = $dom_doc->getElementById('specific_id'); // If you know the id of element you are seeking for try this. This will return a DOMElement //If I want to getINNERHTML for the table element, the code should be: $innerHTML= ''; $children = $element->childNodes; foreach ($children as $child) { $innerHTML .= $child->ownerDocument->saveXML( $child ); } echo $innerHTML; //contain the inner html of the element
Проверьте эти ссылки для получения дополнительной информации.
DOMDocument GetElementsByTagName
DOMDocument GetElementById