Как получить <a> теги в <body>, но исключить разделы верхнего и нижнего колонтитула

Если у меня есть такая страница:

<body>
  <header>
    <a href='http://domain1.com'>link 1 text</a>
  </header>

  <a href='http://domain2.com'>link 2 text</a>

  <footer>
    <a href='http://domain3.com'>link 3 text</a>
  </footer>
</body>

Как мне вытащить <a> теги из <body> но исключить ссылки из <header> а также <footer>?

На настоящей веб-странице будет много <a> теги в <header> поэтому я бы предпочел не циклически проходить через ВСЕ из них.

Я хочу вытащить URL-адреса и текст привязки из каждого из <a> теги, которые НЕ находятся внутри <header> или же <footer> теги.

РЕДАКТИРОВАТЬ: вот как я нахожу ссылки в шапке:

$header = $html->find('header',0);
foreach ($header->find('a') as $a){
  do something
}

Я хотел бы сделать это (обратите внимание на использование "!")

$foo = $html->find('!header,!footer');
foreach ($foo->find('a') as $a){
  do something
}

3 ответа

Решение

Удалите верхний и нижний колонтитулы с DOM, с которым вы работаете, прежде чем искать ссылки.

<?php
    include("simple_html_dom.php");
    $source = <<<EOD
    <body>
        <header>
            <a href='http://domain1.com'>link 1 text</a>
        </header>

        <a href='http://domain2.com'>link 2 text</a>

        <a href='http://domain4.com'>link 4 text</a>

        <footer>
            <a href='http://domain3.com'>link 3 text</a>
        </footer>
    </body>
EOD;

    $html = str_get_html($source);
    foreach ($html->find('header, footer') as $unwanted) {
        $unwanted->outertext = "";
    }
    $html->load($html->save()); 
    $links = $html->find("a");
    foreach ($links as $link) {
        print $link;
};

?>

Не калеча телом? Вы могли бы сделать что-то вроде:

$bad_as = $html->find('header a, footer a');
foreach($html->find('a') as $a){
  if(in_array($a, $bad_as)) continue;
  // do something
}

Это не возможно с простым html-dom, просто, конечно. Вы не можете сделать это с simple-html-dom.

$html->find('body > a');

Этот Css селектор Выбирает все <a> элементы, где родитель является <body> элемент.
Вы должны пройти через дочерние узлы тела, а затем получить <a>

Я предлагаю посмотреть на Как вы анализируете и обрабатываете HTML/XML в PHP?

Со своей стороны я использую Symfony/DomCrawler и Symfony/CssSelector для этого.

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