За последние 24 часа нас посетил 16121 программист и 1546 роботов. Сейчас ищут 925 программистов ...

Парсинг страниц

Тема в разделе "Прочие вопросы по PHP", создана пользователем Womanizer94, 4 июл 2014.

  1. Womanizer94

    Womanizer94 Новичок

    С нами с:
    4 июл 2014
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте форумчане. При написании парсера, возникла проблема такого характера, что поле которое мне нужно, имеет одинаковый вид с полями которые мне не нужны. Мне нужна только скорость, а скрипт парсит и разгон, и расход топлива. Как решить такую проблему?
    Код (Text):
    1. <?php
    2. include 'simple_html_dom.php';
    3. $html = file_get_html('http://auto.yandex.ru/renault/megane/20110523/specs/20110523_20160774_20160770');
    4.  
    5. if(count($html->find('div.b-features__value')))
    6.     foreach($html->find('div.b-features__value') as $div)
    7.         echo $div->innertext."<br>";
    8.  
    9.  $html->clear(); // подчищаем за собой
    10.  unset($html);
    11. ?>
    [​IMG]
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Через регулярные выражения, если фраза "Максимальная скорость" статична можно от этого оттолкнуться
     
  3. Womanizer94

    Womanizer94 Новичок

    С нами с:
    4 июл 2014
    Сообщения:
    2
    Симпатии:
    0
    Но параметр скорости и строка "Максимальная скорость" находятся в разных тегах.
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Плохо знаю регулярные выражения, а лучше сказать почти не знаю, но вот такое сделал, думаю можно было лучше:
    Код (PHP):
    1. $str = '<p>some text</p>
    2. <div class="b-features__name">Максимальная скорость км в час</div>
    3. <div class="b-features__value">552</div>
    4. <p>some text</p>';
    5.  
    6.  
    7. // узнаем где заканчивается '..Максимальная скорость</div>', это должно быть $data1[5][1] (номер позиции)
    8. preg_match('/(<div)+(.?)+(Максимальная скорость)+(.?)+(<\/div>)/i',$str,$data1,PREG_OFFSET_CAPTURE);
    9.  
    10.  
    11. // с конца '..Максимальная скорость</div>' начинаем поиск следующего тега div
    12. // он же должен быть со скоростью
    13. preg_match('/(<div)+(.*)+?(>)+(.*)+?(<\/div>)/i', $str, $data2,null,$data1[5][1]);
    14.  
    15. echo "<h3>Скорость {$data2[0]}</h3>";
    16.  
    PS у меня работает


    или вот так покороче:
    Код (PHP):
    1. $str = '<p>some text</p>
    2. <div class="b-features__name">Максимальная скорость км в час</div>
    3. <div class="b-features__value">100</div>
    4. <p>some text</p>';
    5.  
    6. $r = '/(<div)+(.?)+(Максимальная скорость)+(.?)+(<\/div>)+(\s)+(<div)+(.?)+?(>)+(.*)+?(<\/div>)/i';
    7.  
    8. preg_match($r, $str, $data);
    9. echo $data[10];
    10.  
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Массивы индексировать можно, вы не знали?
    Код (Text):
    1.  
    2. $values = $html->find('div.b-features__value');
    3. $speed = $values[0]->innertext;