market.yandex.ru парсер

Недавно появилась задача парсить странички. Точнее market.yandex.ru.

Собрать все описания в готовом к вставке в базу виде а также доступные изображения к товару.

Исторически сложилось что с регулярками у меня хуже чем с XSLT.

Все хорошо но маркет не дает валидный код и парсить его напрямую у меня не получилось.

На помощь пришел Tidy.

<?php
 
$YMI=(isset($_GET['ymid'])) ? urldecode($_GET['ymid']): ""; // переменная хранит адрес страницы с описанием на Яндексе
$content = file_get_contents($YMI);
 
// $content = iconv("CP1251", "UTF-8//IGNORE", $content); // это строка ненужна така Яндекс маркет перешел на UTF-8
 
$config = array(
"indent"        => true,
"output-xml"    => true,
"wrap"          => 200);
 
$tidy = new tidy;
$tidy->parseString($content, $config, "utf8");
$tidy->cleanRepair();
 
$xml=simplexml_load_string ($tidy);
 
$groups = $xml->xpath("//table[@class="modelProperties"]//tr/td[@class="title"]/b");
$strings = $xml->xpath("//table[@class="modelProperties"]//tr/td[@class="title"]/b|//table[@class=\'modelProperties\']//td[@class=\'label\']/span/text()|//table[@class=\'modelProperties\']//tr/td[position()=2]/text()");
 
$results_groups=array();
$results=array();
$i=0;
$GI=0;
 
//print_r($strings);
while($i<sizeof ($strings))
{
if(in_array($strings[$i],$groups))
{
$GI=sizeof($results_groups);
$results_groups[]=(string)$strings[$i];
$results[$GI][]=array((string)$strings[$i+1],(string)$strings[$i+2]);
$i=$i+3;
}
else
{
$results[$GI][]=array((string)$strings[$i],(string)$strings[$i+1]);
$i=$i+2;
}
}
 
$photos = $xml->xpath("//table[@class="modelpict"]//a/@href");
if(empty($photos))
{
$photos = $xml->xpath("//table[@class="modelpict"]//img/@src");
}
 
foreach( $photos as $photo)
{
print "<img src=\"";
print (string) $photo;
print "\" />";
}
 
print "<hr /><table><caption>Технические характеристики</caption>";
 
foreach($results_groups as $k=>$v)
{
print "<tr><td colspan=\"2\" align=\"center\" style=\"background-color:#ccc\">".$v."</td></tr>";
 
foreach($results[$k] as $arr)
{
print "<tr><td>".$arr[0]."</td><td>".$arr[1]."</td></tr>";
}
}
print "</table>";
 
?>