@IG51

Как починить сломавшийся парсер?

Здравствуйте, был рабочий парсер (в рабочем состоянии я его не видел) который брал данные из таблицы, со страницы и закидывал на страницу в другом сайте, но он перестал работать, возможно изменилась вёрстка на исходном сайте или ещё что то, буду рад любой помощи, спасибо.
<?
function get_news_list($link) 
  {
    // Загружаем HTML-страницу 
    $fd = fopen($link, "r");
    $text=""; 
    if (!$fd) echo "Ошибка загрузки расписания: ".$link; 
    else 
    { 
      // Чтение содержимого файла в переменную $text 
      while (!feof ($fd)) $text .= fgets($fd, 4096); 
    }

// Закрыть открытый файловый дескриптор 
    fclose ($fd);
    return $text;
} // Конец функции

?>

<?
if(CModule::IncludeModule("iblock")) {
  $content=get_news_list('https://1c.ru/cso-part/rus/partners/training/cso/timetable?country=00'); // Получаю расписание
  //$text=iconv("CP1251","UTF-8",$content);
  $pattern='|<table width="100%" border="1" cellspacing="0" cellpadding="5" class="content" style="margin-top: 80px; margin-bottom: 30px;">.*?</table>|s';
  preg_match($pattern, $content, $table);
//die($table[0]);
  $pattern='/(\d{2}-\d{2}\s\w{3,}\s|\d{2}\s\w{3,}\s-\s\d{2}\s\w{3,}\s)/';
  preg_match_all($pattern, $table[0], $dates);
  $pattern='/\d{2}:\d{2}-\d{2}:\d{2}/';
  preg_match_all($pattern, $table[0], $times);
  $pattern='/course[^\w]id=(\d{1,5})/';
  preg_match_all($pattern, $table[0], $ids);
  $all_cells=Array();
  $cycle=0;
  foreach($dates[0] as $key => $value) {
    //die($cycle);
    $all_cells[$cycle][0]=trim($value);
    $all_cells[$cycle][1]=$times[0][$cycle];
    $all_cells[$cycle][2]=$ids[1][$cycle];
    $arFilter=Array("IBLOCK_ID"=>"","PROPERTY_code1s"=>$ids[1][$cycle]);
    $arSelect = Array("ID", "NAME", "DETAIL_PAGE_URL","PREVIEW_TEXT");
    $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
      while($ob = $res->GetNextElement())
        {
          $arFields = $ob->GetFields();
          $all_cells[$cycle][3]=$arFields["NAME"];
          $all_cells[$cycle][4]=$arFields["DETAIL_PAGE_URL"];
          $all_cells[$cycle][5]=$arFields["ID"];
          $all_cells[$cycle][6]=$arFields["PREVIEW_TEXT"];          
        }
    $cycle++;
  }
}
?>

<table class="table" style="border-collapse: collapse; ">
  <tbody>
    <tr align="center">
      <th class="left">Название курса</th>
      <th class="middle"><center>Дата проведения</center></th>
      <th class="right"><center>Оформить заявку</center></th>
    </tr>
  <?
  $color='#f1f1f1';
    foreach($all_cells as $key=>$value):?>
      <? //echo "111"; ?>

      <tr style="background-color:<?=$color?>">
        <td valign="middle"><a href="detail.php?COURSE_ID=<?=$all_cells[$key][5]?>" class="modern"><?=$all_cells[$key][3]?></a>
          <span id="hide<?=$all_cells[$key][5]?>" class="config-visible">
          <a href="javascript:ShowFull('<?=$all_cells[$key][5]?>')" title="Открыть полное описание"><img src="<?=SITE_TEMPLATE_PATH?>/images/open.png" border="0" class="open"></a>
          </span>
          <span id="show<?=$all_cells[$key][5]?>" class="config-hidden" style="display:none;">
          <div style="padding:10px;">
          <?=$all_cells[$key][6]?>
          <a href="javascript:HideFull('<?=$all_cells[$key][5]?>')" title="Свернуть описание"><img src="<?=SITE_TEMPLATE_PATH?>/images/hide.png" border="0" class="hide"></a>
          </div></span>
        </td>

        <td valign="middle" width=20%><center><b><?=$all_cells[$key][0]?><br><?=$all_cells[$key][1]?></b></center></td>
        
        <td valign="middle"><center><a style="margin-top:0px;text-align: center;padding: 9px 5px 9px 5px;" href="registration.php?COURSE_ID=<?=$all_cells[$key][5]?>" class="btn 1">Регистрация</a></center></td>
      </tr>

    <?if($color=="#f1f1f1"): $color="#fff"; else: $color="#f1f1f1"; endif;?>
    <?endforeach;?>
  </tbody>
</table>
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
Exploding
@Exploding
wtf?
Разбираться полностью врядли кто будет, но сходу видно что паттерн в переменной $pattern уже не совпадает с html.

Я бы в таком случае переписал заново под себя.
И парсить html с помощью php методом как в примере - всеравно, что есть вилкой суп)) Можно конечно вилку перемотать скотчем и т.д., но почему бы не использовать jq например тот же.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Типичный битрикс.
Вероятно верстка поменялась. $dates у вас будет пустой.

там на странице нет пробела после даты, и встречаются даты без диапазона.
$pattern='/(\d{2}(?:-\d{2})?\s\w{3,}|\d{2}\s\w{3,}\s-\s\d{2}\s\w{3,})/ui'

вот попробуйте этот вариант паттерн для даты

а так конечно жуть, подумайте над тем чтоб переписать это с помощью норм библиотек
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы