Веб-парсинг 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
спасибо @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