За последние 24 часа нас посетили 21593 программиста и 1029 роботов. Сейчас ищут 757 программистов ...

Парсинг курса валют

Тема в разделе "PHP для новичков", создана пользователем kit, 20 мар 2014.

  1. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    С утра еще все работало
    Код (Text):
    1. <?
    2. $f = @fopen('http://www.cbr.ru/scripts/XML_daily.asp','r');
    3. if($f)
    4. {
    5.     while(!feof($f)) @$text.=fread($f, 4096);
    6.     fclose($f);
    7.     preg_match('|<Value>(.*)<\/Value>|Uis', $text, $curs);
    8. }
    9. else echo "'error'";
    10. print_r($curs);
    11. ?>
    Не знаю, может я чего сломал, но курсы не парсятся.
    Результат Array ( )
    Помогите найти ошибку, пожалуйста!
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Регулярное выражение для парсинга xml?

    Может что то наподобие этого подойдет

    Код (PHP):
    1. if($parser = simplexml_load_string(file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp'))){
    2.     $values = $parser->xpath('/ValCurs/Valute/Value');
    3.     $count = count($values);
    4.     for($i = 0; $i < $count; $i++)
    5.         echo (string)$values[$i];
    6. }
    7. else
    8.     echo 'Error. Cannot load resource';
    9.  
    Добавлено спустя 9 минут 13 секунд:
    Сейчас заметил когда запускашь несколько раз начинает писать
    failed to open stream: Redirection limit reached

    Потом начинает работать. Может и у тебя то же самое.
     
  3. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    У меня не тоже самое, у меня тупо Array ( ). Другими словами массив отсутствует.
    Вопрос не в том "Как сделать парсинг курсов валют?", а в том "Почему мой код не работает?"
    Я аналогичным образом парсю кучу html страниц. Что в этом коде не так?
    Да здесь xml, но какая разница? До сегодняшнего дня код работал! Может я где-то накосячил?
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ты дебажить умеешь?

    Заставил запустить твой код((( убери собаку
    failed to open stream: Redirection limit reached - такое же как и у меня. A array() пишет потому что не может выкачать xml.

    1. Данных не много, нахрена читать построчно?
    2. Есть xml. Поверь, есть способы куда более удобные чем регулярные выражения. Один из способов я привел.
     
  5. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Согласен. Но твой код выдает "Error. Cannot load resource".
    Такое чувство что http://www.cbr.ru/scripts/XML_daily.asp не читается, хотя визуально отображается!
    Что за РЕДИРЕКТ??? WTF???

    Добавлено спустя 8 минут 53 секунды:
    Проверил твой код на другом rss-канале. Все работает. Вообще ничего не понимаю. Почему не читается http://www.cbr.ru/scripts/XML_daily.asp ???
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $parse=file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp');
    2. $parse=new SimpleXMLElement($parse);
    3. foreach($parse->Valute as $key => $value) {
    4.     echo'Валюта: '.$value->CharCode.' Название: '.$value->Name.' Курс: '.$value->Value.'<br>';
    5. }
    P.S. Сильно часто нельзя обращаться к ресурсу, нужно кешить данные.
    Если валюты нужны по ID, в выборке нужно будет указать чтобы искало по иду.
    В данный момент выводит все.
     
  7. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Может в этом причина? Может меня тупо забанили?
    Your, попробовал твой код.
    Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /home/public_html/parsing_.php:3 Stack trace: #0 /home/public_html/parsing_.php(3): SimpleXMLElement->__construct('') #1 {main} thrown in /home/public_html/parsing_.php on line 3
    Вот чего пишет... Что за ошибка? Кто в курсе?
     
  8. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Кстати, сам центробанк рекомендует парсить регулярками! :)))
    http://www.cbr.ru/scripts/usd_cbr_php.zip
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    В банках обычно довольно суровая жизнь.
    Там не всегда высокопрофессиональные люди.

    По моему только у газпрома все пучком :)
     
  10. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Временно спарсил курсы с РБК, но проблема так и не решена. http://www.cbr.ru/scripts/XML_daily.asp по прежнему не читается, хотя визуально отображается!
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    P.S. сразу после первого обращения и обновлять их через указанное время к примеру через день.

    З.Ы. Когда вы уже научитесь читать, что вам пишут?

    Redirection limit reached, в переводчик сложно ввести и разобрать смысл этой ошибки?
    А раз данных нет то ошибка: 'String could not be parsed as XML'
     
  12. INETCHIK

    INETCHIK Активный пользователь

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    Автор! Кажется в filename присутсвуют пробелы; наверно копировал...
    Код (PHP):
    1. $parse=file_get_contents('* http://www.cbr.ru/scripts* /XML_daily.asp');
     
  13. March

    March Новичок

    С нами с:
    15 июн 2017
    Сообщения:
    1
    Симпатии:
    1
    PHP:
    1. $xml_daily_file = __DIR__.'/daily.xml';
    2.  
    3. // кеш на четыре часа
    4. if (!is_file($xml_daily_file) || filemtime($xml_daily_file) < time() - 7200) {
    5.     if ($xml_daily = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp')) {
    6.         file_put_contents($xml_daily_file, $xml_daily);
    7.     }
    8. }
    9.  
    10. // парсим как обычно...
    11. $file = simplexml_load_file($xml_daily_file);
    12.  
    13. $result = array();
    14. foreach ($file as $el) {
    15.     $result["$el->CharCode"] = strtr($el->Value, ',', '.');
    16. }
    17.  
    18. echo $result['USD'];
    19. // другие коды валют аналогично
    20.  
    21. print_r($result);
    Код честно украден с зеркала, которое легко гуглится по запросу "xml_daily.asp"
     
    #13 March, 15 июн 2017
    Последнее редактирование: 15 июн 2017
    AlexProg нравится это.