HTML Parser (aka HTML source Grabber) на PHP
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
HTML Parser (aka HTML source Grabber) на PHP - 2007-01-19 18:05:00.600000
|
|
|
athlant64
Сообщений: 6
Оценки: 0
Присоединился: 2007-01-19 16:36:20.393333
|
Имеется HTML Grabber на PHP, суть работы которого такой: Грузится страница, в ней в определённом месте я вставил этот php код, при выполнении которого тянется страница "http://www.microsoft.com/blahblah.html", ищется первое попадание определённого слова (тэга), копируется source html кода до определённого места и вставляется в мою страницу То бишь когда пользователь грузит страницу в нее автоматом вставляется кусок страницы удалённого сайта. Ниже приведен листинг этого HTML Граббера:
<?
if(!($myFile=fopen("АДРЕС_СТРАНИЦЫ_ИЗ_КОТОРОЙ_КОПИРОВАТЬ","r")))
{
echo "The news interface is down for maintenance.";
exit;
}
while(!feof($myFile))
{
$myLine.=fgets($myFile,255);
}
fclose($myFile);
$start="КУСОК_КОДА_ОТКУДА_НАЧИНАТЬ_КОПИРОВАТЬ";
$end="КУСОК_КОДА_НА_КОТОРОМ_ЗАКАНЧИВАТЬ_КОПИРОВАТЬ";
$start_position=strpos($myLine, $start);
$end_position=strpos($myLine, $end)+strlen($end);
$length=$end_position-$start_position;
$myLine=substr($myLine, $start_position, $length);
// Display HTML
echo $myLine;
?>
Помогите доработать его! Нужно добавить перекодировку русских символов, т.е. Доспустим моя страница имеет charset=windows-1251 а страница с которой тянется кусок HTML имеет charset=UTF-8, в результате отграббленый текст на моей странице отображается неправильно. И еще допустим что кусок отграббленного HTML содержит путь на картинки: /images/pic.gif то бишь получается www.microsoft.com/images/pic.gif, а граббер тупо копирует этот путь "/images/pic.gif", внедряет его в мою страницу и получается в результате такой путь www.mysite.com/images/pic.gif и естесственно картинки не подгружаются. Как можно исправить эти недоделки?
|
|
|
RE: HTML Parser (aka HTML source Grabber) на PHP - 2007-01-19 19:05:31.803333
|
|
|
tkvit
Сообщений: 50
Оценки: 0
Присоединился: 2007-01-07 17:48:20.876666
|
В php есть такая функция convert_cyr_string($string, $from, $to) надо ей обработать переменную в которой содержиться исходная строка, и все будет нормально, а насчет рисунков, то возможно это из-за того что путь указан от корня сервера попробуй убрать слэш перед images
|
|
|
RE: HTML Parser (aka HTML source Grabber) на PHP - 2007-01-19 19:27:06.773333
|
|
|
Lex_Voodoo
Сообщений: 7328
Оценки: 0
Присоединился: 2004-12-07 13:55:12
|
quote:
ORIGINAL: tkvit В php есть такая функция convert_cyr_string($string, $from, $to) надо ей обработать переменную в которой содержиться исходная строка, и все будет нормально Чушь. Сказано же - utf8. Причём тут convert_cyr_string. По сабжу - юзать это: http://www.php.net/manual/ru/function.iconv.php quote:
ORIGINAL: tkvit а насчет рисунков, то возможно это из-за того что путь указан от корня сервера попробуй убрать слэш перед images Чушь №2. Путь указан до другого сервера. Это значит, что сайт находится на site1.ru, картинка - на site2.ru. Очевидно, надо прогонять текст через какой-нибудь preg_replace и вставлять перед каждым относительным путем 'http://site2.ru/'
|
|
|
RE: HTML Parser (aka HTML source Grabber) на PHP - 2007-01-20 04:21:08.650000
|
|
|
NullGroup
Сообщений: 3
Оценки: 0
Присоединился: 2007-01-20 03:54:16.410000
|
Посмотри скрипт newsgraber (!платный продукт!). Сейчас он доступен бесплатно с полным открытым кодом на пхп. Там и сохранение картинок и текста и создано исключение определенного текста и тэгов.
|
|
|
RE: HTML Parser (aka HTML source Grabber) на PHP - 2007-01-22 02:23:18.743333
|
|
|
xzirrow
Сообщений: 16
Оценки: 0
Присоединился: 2006-11-19 23:52:59.466666
|
2 athlant64 ну ты поидее правильно тему то назвал . Прийдеться тебе то что ты тянешь парсить . Насчет кодировки не спец вот насчет картинок придеться пути переправлять ну тоесть всмысле BASE тег чуть перед передачей страницы друго подправить . Случайно не рыбку ловить собрался ?
|
|
|
RE: HTML Parser (aka HTML source Grabber) на PHP - 2007-01-26 01:24:21.400000
|
|
|
athlant64
Сообщений: 6
Оценки: 0
Присоединился: 2007-01-19 16:36:20.393333
|
quote:
ORIGINAL: Lex_Voodoo 1. По сабжу - юзать это: http://www.php.net/manual/ru/function.iconv.php 2. Путь указан до другого сервера. Это значит, что сайт находится на site1.ru, картинка - на site2.ru. Очевидно, надо прогонять текст через какой-нибудь preg_replace и вставлять перед каждым относительным путем 'http://site2.ru/' 2 Lex_Voodoo - Премного благодарен! Помогло! Тока пришлось не то что доделывать, а полностью делать с нуля. Получился отдельный модуль. Если кому нужно - выкладываю: grabber.php
<?
if (!$addr){
$EXTERNALPAGE = importPage("http://www.site.com/index.htm");//здесь урл сайта
}
else {
$EXTERNALPAGE = importPage($addr);
}
function importPage( $addr ) {
// Разбор URL на имя сервера, путь и имя файла.
$pattern1 = '|(http://)([^/]*)/{0,1}(.*)|';
$base = "";
if (preg_match($pattern1, $addr, $list)) {
$server = "http://".$list[2];
$fullpath = $list[3];
$pattern11 = '|(.*)/([^/]*)$|';
if ( preg_match($pattern11, $fullpath, $list) ) {
$path = $list[1];
$fname = $list[2];
} else {
$path = "";
$fname = $fullpath;
}
if ($path) $path = "/".$path;
$base = $server.$path;
}
// Загрузить документ
$arr = @file($addr);
if ( !$arr ) return "Page not found!";
$str = join( "", $arr );
///*
// Взять только то, что находится между тегами <body> и </body>
$pattern2 = '|<body.*?>(.*)</body>|sei';
//Та самая функция - конвертер символов из UTF-8 в Windows-1251
if (preg_match($pattern2, $str, $list)) $str = iconv("UTF-8", "CP1251", $list[1]);
// Обработка тегов <img>. Если атрибут src - не URL,
// а локальный путь, надо заменить его на URL
// соответствующего рисунка.
// Различаются абсолютные пути (от корня) и относительные.
$pattern3 =
'/(<img\s.*?src\s*=\s*("{0,1}))([^">]*)(\2[^>]*>)/sei';
//$str = preg_replace ($pattern3, '', $str);//убираем картинки
$str = preg_replace($pattern3,
"stripslashes((strpos('\\3','ttp:')<=0) ".
"?((strspn('\\3','/')<=0)".
"?'\\1$base/\\3\\4'".
":'\\1$server\\3\\4' )".
":'\\0')",
$str);
// Аналогично - обработка тегов <a>.
$pattern4 =
'/(<a\s.*?href\s*=\s*("{0,1}))([^">]*)(\2[^>]*>)/sei';
$str = preg_replace($pattern4,
"stripslashes((strpos('\\3','ttp:')<=0)&&".
"(strpos('\\3','ailto:')<=0) &&".
"(Ord('\\3')!=Ord('#')) ".
"?((strspn('\\3','/')<=0)".
"?'\\1$base/\\3\\4'".
":'\\1$server\\3\\4' )".
":'\\0')",
$str);
return $str;
}
?>
<?= $EXTERNALPAGE?>
А в тело например index.php нужно вставить следующее:
<?
include("grabber.php");
?>
|
|
|
|
|