Разбор 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 для доступа к большему количеству вещей внутри.

Другие вопросы по тегам