HTML-разбор и захват URL-адресов с помощью DOMdocument - PullRequest
0 голосов
/ 22 октября 2018

Попытка получить URL-адреса.Но мой цикл foreach просто возвращает URL из первых двух <div> элементов.Это не идет дальше.

Функция:

function getSiteContent($url)
{
    $html = cache()->rememberForever($url, function () use ($url) {
        return file_get_contents($url);
    });

    $parser = new \DOMDocument();
    $parser->loadHTML($html);
    return $parser;

}

Код:

libxml_use_internal_errors(true);

$url = 'http://www.sumitomo-rd-mansion.jp/kansai/';
$parser = getSiteContent($url);

$allDivs = $parser->getElementsByTagName('div');
foreach ($allDivs as $div) {
   if ($div->getAttribute('id') == 'areaWrap') {
      $innerDivs = $div->getElementsByTagName('div');
      foreach ($innerDivs as $innerDiv) {
         if ($innerDiv->getAttribute('class') == 'areaBox clearfix') {
             $links = $innerDiv->getElementsByTagName('a');
             if ($links->length > 0) {
                 $a = $links->item(0);
                 $linkRef = $a->getAttribute('href');
                 $link [] = $linkRef;
             }
         }
      }
   }
}

var_dump($link); 

Результат:

array(2) {
  [0]=>
  string(65) "http://www.sumitomo-rd-mansion.jp/kansai/higashi_umeda/index.html"
  [1]=>
  string(60) "http://www.sumitomo-rd-mansion.jp/kansai/osaka745/index.html"
}

с этим кодом я просто получаю первый и второй div areaBox.И останавливаться там.Мой цикл foreach неправильный?Или у веб-сайта есть какая-то проблема, которая мешает царапинам?Спасибо, что помогли мне.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я знаю, что уже есть принятый ответ, но я бы не рекомендовал использовать эту библиотеку "simple_html_dom", которой более 10 лет, и она очень долго не разрабатывалась.Я предлагаю вам придерживаться DomDocument, и вы можете использовать запросы XPath, чтобы избежать всех циклов, которые вы делаете:

<?php
$xpath = new \DOMXPath($parser);
$nodes = $xpath->query("//div[@id='areaWrap']//div[contains(@class, 'areaBox')]//a[1]");
foreach ($nodes as $node) {
    $links[] = $node->getAttribute("href");
}

Проблема, с которой вы сталкиваетесь на этой странице, - это недопустимые данные в HTML.Если вы избавитесь от libxml_use_internal_errors(true);, вы увидите предупреждения, связанные с недопустимыми символами.В вашей функции getSiteContent вы можете преобразовать текст перед загрузкой в ​​DomDocument:

$html = mb_convert_encoding($html, "SJIS", "UTF-8");

Это дает ожидаемый результат:

array(7) {
  [0]=>
  string(65) "http://www.sumitomo-rd-mansion.jp/kansai/higashi_umeda/index.html"
  [1]=>
  string(60) "http://www.sumitomo-rd-mansion.jp/kansai/osaka745/index.html"
  [2]=>
  string(60) "http://www.sumitomo-rd-mansion.jp/kansai/kyobashi/index.html"
  [3]=>
  string(59) "http://www.sumitomo-rd-mansion.jp/kansai/tsurumi/index.html"
  [4]=>
  string(62) "http://www.sumitomo-rd-mansion.jp/kansai/kitatanabe/index.html"
  [5]=>
  string(47) "http://sumai.tokyu-land.co.jp/branz/umedanorth/"
  [6]=>
  string(63) "http://www.sumitomo-rd-mansion.jp/kansai/momoyamadai/index.html"
}
0 голосов
/ 23 октября 2018

Вы можете получить желаемый результат, используя simple_html_dom.Я использовал эту библиотеку, потому что она поддерживает селектор CSS.Попробуйте приведенный ниже скрипт.

<?php
include("simple_html_dom.php");

$weblink = "http://www.sumitomo-rd-mansion.jp/kansai/";
function fetch_sumitomo_links($weblink)
{
    $htmldoc   = file_get_html($weblink);
    foreach ($htmldoc->find(".name a") as $a) {
        $links[]          = $a->href . '<br>';
    }
    return $links;
}
$items = fetch_sumitomo_links($weblink);
foreach($items as $itemlinks){
    echo $itemlinks;
}
?>
...