使用 DOMparser 进行 Webscraping 时的数组输出问题

Array output problem at Webscraping with DOMparser

我在代码的第二部分遇到一些输出问题。

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它。它说数组 0 我不明白为什么它不进入那些与 foreach 的链接 我的代码错了吗?我在这里错过了什么?对此有什么想法吗? 谢谢你帮我。

看来你的问题出在这里:

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

修复应该让你开始。

正如我在评论中所说,当您尝试遍历它时 $siteler 是空的,但还有几个问题:

  • 首先,当 link 正好是“https://sumai.tokyu-land.co.jp”时,您的代码最多只会触发一次,我不确定这是否是您想要的。
  • 您正在对数组调用 DOM 函数。
  • 似乎只关心 'div' 标签内的 links。
  • 您在每个循环中重新定义 $link 变量,因此最终结果将只有一个 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');
                } 
            }
        }
    } 
}

然而,这不会检查 link 是否已经存在于数组中,并且有可能一遍又一遍地处理相同的 link。我强烈建议使用现有的抓取工具。

根据评论,原来 pc_hnaviid 而不是 class,您只对第一个 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);
    $div = $dom->getElementById('pc_hnavi');
    if ($div != null) {
      $links = $div->getElementsByTagName('a');
      if ($links->length > 0) {
        $a = $links->item(0); 
        $link[] = $a->getAttribute('href');
      }
    }
  }
}