Разбор PHP DOM для доступа к элементам внутри определенного идентификатора div
У меня есть немного HTML следующим образом:
<div id="tvcap">
<div class="c" id="tads">
<ol>
<li>
<div class="vsc vsta">
<h3>
<a id="pa1" href="">
</a>
<a id="vpa1" href="http://www.link1.com">
Link 1 Text 1</a>
</h3>
<div>
<div class="kv kva">
<cite>
www.link1.com</cite>
</div>
</div>
<span class="ac">Link 1 Text2</span>
</div>
</li>
<li>
<div class="vsc vsta">
<h3>
<a id="pa2" href="">
</a>
<a id="vpa2" href="http://www.link2.com">Link 2 Text 1</a>
</h3>
<div>
<div class="kv kva">
<cite>www.link2.com</cite>
</div>
</div>
<span class="ac">Link 2 Text 3</span>
<div>
<div class="oslk">
</div>
</div>
</div>
</li>
</ol>
</div>
</div>
Потенциально там будет неизвестное количество ссылок и текстов, и я хочу повторить и иметь возможность добраться до каждой ссылки и текста.
Я использую простой HTML-анализатор DOM.
Я не могу найти команду, чтобы добраться до div id 'vpa1'.
Я пробовал это, но ничего не возвращает:
foreach($html->find('a') as $element)
if ($element->id == "vpa1") echo $element->href . '<br>';
Как я могу получить к каждой ссылке и тексту, основываясь на идентификаторе vpa[$i] (vpa1, vpa2 и т. Д.).
3 ответа
Функция для извлечения содержимого из определенного идентификатора div с любой веб-страницы
Приведенная ниже функция извлекает содержимое из указанного div и возвращает его. Если div с идентификатором не найдены, возвращается false.
function getHTMLByID($id, $html) {
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$node = $dom->getElementById($id);
if ($node) {
return $dom->saveXML($node);
}
return FALSE;
}
$id
это идентификатор <div>
чей контент вы пытаетесь извлечь, $html
ваша HTML разметка
Пример использования:
$html = file_get_contents('http://www.mysql.com/');
echo getHTMLByID('tagline', $html);
Выход:
The world's most popular open source database
Как сказал @Wrikken, Xpath будет не быстрым, а простым решением.
Вот код, который вы можете использовать в качестве начальной точки:
$some_html = file_get_contents('some_html.html'); // i put your html into some_html.html file
$doc = new DOMDocument();
$doc->loadHtml($some_html); // $some_html should contain your html string
$xpath = new DOMXPath($doc);
//process with no bugs
$result = $xpath->query('//*[@id="vpa1"]');
var_dump($result);
if (!empty($result)) {
foreach ( $result as $link ) {
var_dump($link->nodeValue);
}
}
// output
// object(DOMNodeList)#4 (1) { ["length"]=> int(1) } string(38) " Link 1 Text 1"
$result = $xpath->query('//a');
var_dump($result);
if (!empty($result)) {
foreach ( $result as $link ) {
var_dump($link->nodeValue);
}
}
// output
// object(DOMNodeList)#8 (1) { ["length"]=> int(4) } string(25) " " string(38) " Link 1 Text 1" string(17) " " string(13) "Link 2 Text 1"
Для меня сначала было найти div с указанной строкой id с помощью следующей команды (которая использует простой анализатор dom):
$div = $html->find('div#'.$divId)
а затем использовать переменную div для доступа к большему количеству вещей внутри.