PHP简单DOM解析器从多个URL中截取

时间:2011-06-16 04:04:02

标签: php html-parsing web-scraping

是否可以使用foreach循环从数组中抓取多个URL?我一直在尝试,但由于某种原因它只会从数组中的第一个URL拉出来并显示结果。

include_once('../../simple_html_dom.php');

$link = array (
'http://www.amazon.com/dp/B0038JDEOO/',
'http://www.amazon.com/dp/B0038JDEM6/',
'http://www.amazon.com/dp/B004CYX17O/'
);


foreach ($link as $links) {

function scraping_IMDB($links) {
// create HTML DOM
$html = file_get_html($links);

$values = array(); 
foreach($html->find('input') as $element) {     
$values[$element->id=='ASIN'] = $element->value; }  


// get title
$ret['ASIN'] =  end($values);

// get rating
$ret['Name'] = $html->find('h1[class="parseasinTitle"]', 0)->innertext;

$ret['Retail'] =$html->find('b[class="priceLarge"]', 0)->innertext;

// clean up memory
//$html->clear();
   // unset($html);

return $ret;
}



// -----------------------------------------------------------------------------
// test it!



$ret = scraping_IMDB($links);



foreach($ret as $k=>$v)

    echo '<strong>'.$k.'</strong>'.$v.'<br />';

}

这是代码,因为评论部分不起作用。 :)它非常脏,因为我刚编辑了一个例子来玩它,看看我是否可以让它做我想做的事。

2 个答案:

答案 0 :(得分:3)

include_once('../../simple_html_dom.php');

function scraping_IMDB($links) {
    // create HTML DOM
    $html = file_get_html($links);

// What is this spaghetti code good for?    
/*
    $values = array(); 
    foreach($html->find('input') as $element) {     
        $values[$element->id=='ASIN'] = $element->value;
    }  

    // get title
    $ret['ASIN'] = end($values);
*/
    foreach($html->find('input') as $element) {
        if($element->id == 'ASIN') {
             $ret['ASIN'] = $element->value;
        }
    }

// Our you could use the following instead of the whole foreach loop above
//
// $ret['ASIN'] = $html->find('input[id="ASIN"]', 0)->value;
//
// if the 0 means, return first found or something similar,
// I just had a look at Amazons source code, and it contains 
// 2 HTML tags with id='ASIN'. If they were following html-regulations
// then there should only be ONE element with a specific id.

    // get rating
    $ret['Name'] = $html->find('h1[class="parseasinTitle"]', 0)->innertext;

    $ret['Retail'] = $html->find('b[class="priceLarge"]', 0)->innertext;

    // clean up memory
    //$html->clear();
    // unset($html);

    return $ret;
}



// -----------------------------------------------------------------------------
// test it!

$links = array (
    'http://www.amazon.com/dp/B0038JDEOO/',
    'http://www.amazon.com/dp/B0038JDEM6/',
    'http://www.amazon.com/dp/B004CYX17O/'
);

foreach ($links as $link) {
    $ret = scraping_IMDB($link);
    foreach($ret as $k=>$v) {
        echo '<strong>'.$k.'</strong>'.$v.'<br />';
    }
}   

这应该可以解决问题

我已将数组重命名为'links'而非'link'。这是一个包含链接的链接数组,因此,foreach($link as $links)似乎错了,我将其更改为foreach($links as $link)

答案 1 :(得分:0)

我真的需要问这个问题,因为它会在世界读完这个帖子后回答更多问题。如果......你使用的文章就像简单的html dom网站一样。

$ret['Name'] = $html->find('h1[class="parseasinTitle"]', 0)->innertext;

$ret['Retail'] = $html->find('b[class="priceLarge"]', 0)->innertext;

return $ret;

}


$links = array (
'http://www.amazon.com/dp/B0038JDEOO/',
'http://www.amazon.com/dp/B0038JDEM6/',
'http://www.amazon.com/dp/B004CYX17O/'
);

foreach ($links as $link) {
$ret = scraping_IMDB($link);
foreach($ret as $k=>$v) {
    echo '<strong>'.$k.'</strong>'.$v.'<br />';
}
} 

如果它的文章是什么?

$articles[] = $item;    

}
//print_r($articles); 

$links = array (
'http://link1.com',
'http://link2.com',
'http://link3.com'
);

这个区域会是什么样的?

foreach ($links as $link) {
$ret = scraping_IMDB($link);
foreach($ret as $k=>$v) {
    echo '<strong>'.$k.'</strong>'.$v.'<br />';
}
} 

我在过去的两年里看到了遍布stackoverflow的多个链接,我仍然无法弄明白。很高兴能够获得简单的html dom示例的基本句柄。

THX。

第一次发布我确定我打破了一堆规则并没有正确执行代码部分。我只是不得不严重地问这个问题。