Проблема вывода массива на Webscraping с DOMparser - PullRequest
0 голосов
/ 06 октября 2018

Во второй части моих кодов у меня возникают проблемы с выводом.

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 = 'https://sumai.tokyu-land.co.jp/osaka';
$parser = getSiteContent($url);

$allDivs =[];
$allDivs = $parser->getElementsByTagName('div');
foreach ($allDivs as $div) {
    if ($div->getAttribute('class') == 'p-articlelist-content-right') {
        $allLinks = $div->getElementsByTagName('a');
        foreach ($allLinks as $a) {
            $getlinks[] = $a->getAttribute('href');
        }
    }
}

var_dump($getlinks);

В этом var_dump я вижу ссылки, которые я удалил.Нет проблем "до здесь.И еще раз.Я хочу перейти на эти ссылки.Вот почему я написал коды прямо ниже.

getSiteContent($getlinks);
$link = [];
$siteler = [];
foreach ($siteler as $site) {
    if($site == 'https://sumai.tokyu-land.co.jp'){
    $site = $getlinks->getElementsByTagName('div');
        foreach ($site as $links) {
            if($links->getAttribute('class') == 'pc_hnavi'){
                $linker = $links->getElementsByTagName('a');
                foreach ($linker as $a) {
                    $link = $a->getAttribute('href');
                } 
            }
        }
    } 
}

var_dump($link);

Когда я var_dump это.Это говорит Array 0 Я не понял, почему это не идет в тех ссылках с foreach Мои коды неверны?Что мне здесь не хватает?Есть идеи для этого?Спасибо, что помогли мне.

Ответы [ 2 ]

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

Как я уже говорил в комментариях $siteler пусто, когда вы пытаетесь пройти через него, но есть еще пара проблем:

  • Сначала ваш код будет срабатывать не более одного раза, когдассылка точно 'https://sumai.tokyu -land.co.jp ', и я не уверен, что это то, что вы хотите.
  • Вы вызываете DOM функций в массиве.
  • Кажется, что заботятся только о ссылках внутри тегов 'div'.
  • Вы переопределяете переменную $link в каждом цикле, так что в результате вы получите только одну ссылку.

Это фиксированный код:

$link = [];
foreach ($getlinks as $site) {
    // Any link in the domain, not just the homepage
    if(strpos($site, 'https://sumai.tokyu-land.co.jp') === 0) {
        $dom = getSiteContent($site);
        $divs = $dom->getElementsByTagName('div');
        foreach ($divs as $div) {
            // Can have more than one class
            $attrs = explode(' ', $div->getAttribute('class'));
            if(in_array('pc_hnavi', $attrs)) {
                $linker = $div->getElementsByTagName('a');
                foreach ($linker as $a) {
                    // Add to the array
                    $link[] = $a->getAttribute('href');
                } 
            }
        }
    } 
}

Однако он не проверяет, существует ли ссылка в массиве и может ли она обрабатывать одни и те же ссылки снова и снова.Я настоятельно рекомендую использовать существующий сканер.

Из комментариев выясняется, что pc_hnavi - это id, а не класс, и вас интересует только первая ссылка.Вы можете получить доступ к этому элементу напрямую, без перебора элементов:

foreach ($getlinks as $site) {
  // Any link in the domain, not just the homepage
  if(strpos($site, 'https://sumai.tokyu-land.co.jp') === 0) {
    $dom = getSiteContent($site);
    $div = $dom->getElementById('pc_hnavi');
    if ($div != null) {
      $links = $div->getElementsByTagName('a');
      if ($links->length > 0) {
        $a = $links->item(0); 
        $link[] = $a->getAttribute('href');
      }
    }
  }
}
0 голосов
/ 07 октября 2018

Похоже, ваша проблема здесь:

...
$siteler = []; // $siteler is set to an empty array ...
foreach ($siteler as $site) { // then you loop through the empty array which does nothing ...
    ...
}
...

Исправление, которое должно начать вас.

...