使用DOMparser进行Web抓取时的数组输出问题

时间:2018-10-06 17:07:50

标签: javascript php laravel 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的那些链接中没有显示 我的密码有误吗?我在这里想念什么?有什么想法吗? 谢谢你帮我

2 个答案:

答案 0 :(得分:1)

正如我在评论中说的,__init在您尝试遍历时为空,但是还有更多问题:

  • 首先,当链接恰好为“ https://sumai.tokyu-land.co.jp”并且您不确定您想要的是什么时,您的代码最多只会触发一次。
  • 您正在数组上调用$siteler函数。
  • 似乎只在乎'div'标签内的链接。
  • 您在每个循环上重新定义DOM变量,因此最终结果将只是一个链接。

这是固定代码:

$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

答案 1 :(得分:0)

您的问题似乎在这里:

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

修复该问题,可以帮助您入门。