PHP уеб скрапинг

Имам код, който ще премахне данните от уебсайт. Резултатът е нещо подобно:
Селско стопанство
Храна
Облекло
Как да изведа само първата/n-та категория, като например само (Селско стопанство)? опитах

echo $sub_title[1].'<br/>';

но изглежда не работи.

Моят код:

<?php
$ch = curl_init('http://www.alibaba.com/Products');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$html = curl_exec($ch);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$finder = new DOMXPath($dom);
$nodes = $finder->query('//h4[@class="sub-title"]');

foreach ($nodes as $node) {
    $sub_title = trim(explode("\n", trim($node->nodeValue))[0]);
    echo $sub_title.'<br/>';

}

?>

person Cael    schedule 14.11.2014    source източник


Отговори (2)


Можете да го направите по много начини, един от начините е просто да използвате ключа foreach и да добавите условие if вътре в цикъла:

// indices start at zero
$fifth = 4; // or 5 - 1

foreach ($nodes as $key => $node) {
    if($key == $fifth) {
        $sub_title = trim(explode("\n", trim($node->nodeValue))[0]);
        echo $sub_title.'<br/>';
    }
}

Или добавете друга заявка, за да я насочите изрично към тази n-та позиция:

$fifth = $finder->evaluate('
    string(
        (//h4[@class="sub-title"])[5]
    )
');
$fifth = explode("\n", trim($fifth));
echo $fifth[0];

Или ги поставете в контейнер (масив), след което изрично ги извикайте по индекс (съгласно коментарите по-долу):

$sub_title = array();
foreach ($nodes as $key => $node) {
    $sub_title[] = trim(explode("\n", trim($node->nodeValue))[0]);
}

echo $sub_title[4]; // call fifth
person Kevin    schedule 14.11.2014
comment
thx @Ghost. Има ли начин, по който мога да задам всяка от тези категории на масив автоматично, вместо да пиша толкова много променливи: $one = 0; $две = 1; $три = 2; ..... така че мога просто да използвам echo $sub_title[0]; за извеждане на всяка n-та категория? - person Cael; 14.11.2014
comment
@Cael, да, възможно е, просто ги присвоете/бутнете вътре в масив, след което извикайте чрез цифров индекс. проверете ревизията по-горе - person Kevin; 14.11.2014

Опитайте това във вашия цикъл:

$sub_titles = explode("\n", $node->nodeValue);
$first_sub_title = trim($sub_titles[0]);
echo $first_sub_title.'<br/>';
person Mikhail Janowski    schedule 14.11.2014