универсальный парсер

Zood

Создатель
Регистрация
18 Июн 2008
Сообщения
35
Реакции
0
пробую для себя написать универсальный парсер сайтов.
Который парсит согласно регулярному выражению пачку юрлов и сохраняем результат в файл...
Возник трабел с распознанием utf-8, победить кракозябры не могу даже с iconv :confused:
вообщем хелп ми :bc:
PHP:
<?
///////////// * CONFING *///////////////
$log="";
$pass="";
$dir="";
$fname="site-parser.csv";
$ftp="ftp://$log:$pass@ftp.site.host.ru/$dir/$fname";
$fcontent='';
?>
<html>
<body>
<form action="" method="POST">
<textarea cols="70" rows="15" name="url"></textarea>
<br />
<br />
<input type="text" name="reg" size="50">
<br />
<br />
<input type="submit" value="отправить">
</form>
</body>
</html>
<?
if($_POST[url]){
$treg=trim($_POST[reg]);
$reg="#$treg#i";
echo'<br>'.$reg.'<br>';
$ar_url=explode("\r\n",$_POST[url]);
//print_r($ar_url);
foreach($ar_url as $line => $key){
$f=file_get_contents($key);
if(!strpos("#charset=utf-8#i",$f)){
preg_match_all($reg,$f,$match_ar);
$res_ar[]=array($key,$match_ar);
}
else{
preg_match_all($reg,iconv("UTF-8", "windows-1251",$f),$match_ar);
$res_ar[]=array($key,$match_ar);
}
}
}
//print_r($res_ar);
/*if ($handle=fopen($ftp,"w")) {
         echo "Не могу открыть файл ($fname)";
         exit;}*/
//echo'<br />====================<br />';
foreach($res_ar as $line => $key){
foreach($key as $line2 => $key2){
if(is_array($key2))
{
foreach($key2[0] as $line3 => $key3){
//echo$key3.'<br />';
$fcontent.=($line+1)."\t".$res_url.trim($key3)."\t".$key2[1][$line3]."\r\n";
}
}
else
{
$res_url=$key2."\t";
}
}
}
	echo'<textarea cols="90" rows="20">'.$fcontent."</textarea><br />";	 
	echo'<textarea cols="90" rows="20">';
	print_r($res_ar);
	echo'</textarea><br />';	 
/*
if (fwrite($handle,$fcontent)=== FALSE) {
        echo "Не могу произвести запись в файл ($fname)";
        exit;}	
	*/
?>
 
Много кода, извини, неосилил. Начал с твоего, время позднее, доделал уже как сам умею, сори, просто разбиратся в чужом коде, сам знаешь, иногда проще с нуля написать :)

Насчет кодировок, сделал таким макаром: решил работать с utf-8, если скачиваю страницу windows-1251, переделываю с iconv в utf-8.

В результате печатает все урлы, где нашлась искомая комбинация. Ну, в принципе код довольно простой, если что, продолжим тут.

PHP:
<?php
header('Content-Type: text/html; charset=UTF-8');

if (isset($_POST['urls'])) {
	$needle = trim($_POST['needle']);
    $ar_url = explode("\r\n", $_POST['urls']);
	$ar_url = array_unique($ar_url);
	$res_ar = array();
	foreach ($ar_url as $url) {
		$url = trim($url);
		$html = file_get_contents($url);
		if (preg_match('%charset=windows-1251%i', $html))
			$html = iconv("Windows-1251", "UTF-8", $html);
		if (preg_match('%'.$needle.'%i', $html))
			$res_ar[] = $url;
	}

foreach ($res_ar as $url)
	echo $url.'<br />';
}
?>

<form action="" method="POST">
	<textarea cols="70" rows="15" name="urls"><?=$urls?></textarea><br /><br />
	<input type="text" name="needle" size="50" value="<?=$needle?>"/><br /><br />
	<input type="submit" value="Отправить" />
</form>
 
Скрипт проверяет кодировку в переменной $data и если там юникод, то меняет на 1251.
PHP:
if (preg_match('//u', $data)) {  
	$data=iconv("UTF-8", "windows-1251", $data);
}
PS
Сам писал такой парсер. Спарсил себе 2 каталога статей и один новостной сайт, теперь не знаю куда все это девать :D (Шутка).
 
нашел решение это задачи след образом
скачиваем сайт с помощью offline explorer (или teleport)
а потом парсим из скаченых файлов нужные нам данные с помощью проги textpipe
 
Назад
Сверху