PDA

View Full Version : سوال: دریافت اطلاعات جدول یک سایت



DR.HTML
سه شنبه 23 اسفند 1390, 15:43 عصر
سلام دوستان من میخوام اطلاعات جدول یک سایت رو دریافت کنم اما نیتونم براش محدوده تعیین کنم چون این جدول توی صفحه اصلیه و همین باعث میشه کل نشوته های صفحرو نشون بده شما دقت کنین
$viva=file_get_contents("http://example.com");
echo "$viva"; ?>
حالا چطور میتونم کاری کنم که فقط محدو ده ای رو که میخوام نشون بده نه همرو !
مثلا بین دوتا div
میشه کمک کنین
جستجو کردم به نتیجه ای که لازم دارم نرسیدم

Reza1607
سه شنبه 23 اسفند 1390, 16:25 عصر
دوست عزيز شما بايد از عبارتهاي منظم ( Regular expression ) استفاده كني
متاسفانه من باهاش كار نكردم و دقيقا نمي دونم چه جوريه و گرنه بهتون مي گفتم

MMSHFE
سه شنبه 23 اسفند 1390, 16:47 عصر
بدون عبارتهای منظم هم میشه. شما باید سورس کدی که بهتون نشون میده رو بررسی کنید و با ترکیب substr و strpos و strrpos قسمتی که میخواین رو جدا کنید. مثلاً فرض کنید محتویات example.com اینه:


<!doctype html>
<html>
<head>
<title>Example</title>
<meta charset="utf-8"/>
</head>
<body>
<div>
Main Contents
<div>
Sub Contents
<div>
Final Contents
</div>
</div>
</div>
</body>
</html>

و حالا شما فقط محتویات اون div که توش نوشته Final Contents رو میخواین. همونطور که میبینید، از ابتدای رشته سه تا <div> رو باید رد کنیم و از انتها هم به اندازه سه تا <div/> باید برگردیم عقب. ببینیم چطور این کار رو باید انجام بدیم:


<?php
$example = file_get_contents('http://example.com');
// Remove the text before 1st <div>
$example = substr($example, strpos($example, '<div>'));
// Remove the text before 2nd <div>
$example = substr($example, strpos($example, '<div>'));
// Remove the text before 3rd <div>
$example = substr($example, strpos($example, '<div>'));
// Remove the text after 1st </div> from the end of text
$example = substr($example, 0, strrpos($example, '</div>'));
// Remove the text after 2nd </div> from the end of text
$example = substr($example, 0, strrpos($example, '</div>'));
// Remove the text after 3rd </div> from the end of text
$example = substr($example, 0, strrpos($example, '</div>'));
echo trim($example);
// Output: Final Contents
?>

اگه سؤالی بود در خدمتم. موفق باشید.

Reza1607
سه شنبه 23 اسفند 1390, 16:50 عصر
به نظرتون همچين كاري براي يك صفحه وب كه مسلما خيلي پيچيده تر از اين حرفاست ميشه از اين روش استفاده كرد :متفکر:

MMSHFE
سه شنبه 23 اسفند 1390, 17:27 عصر
اگه نخوایم با RegEx کار کنیم، مجبوریم دیگه. درسته یکم سختی و پیچیدگی داره ولی بالأخره میشه یک راهی پیدا کرد که محتوای دلخواهمون رو از توی صفحه استخراج کنیم. برای مثال، ممکنه هرچقدر هم که محتوای صفحه تغییر کنه، محتوایی که ما میخوایم، سومین پاراگراف داخل اولین div توی تگ body باشه. یا هر چیز دیگه. یا اینکه جدولی که میخوایم، یک id داشته باشه که با استفاده از اون، اطلاعات رو جدا کنیم. مثلاً کد زیر رو ببینید:


<!doctype html>
<html>
<head>
<title>Example</title>
<meta charset="utf-8"/>
</head>
<body>
<div>Some Contents<div>
<div>Some Contents<div>
<div>Some Contents<div>
<table border="1px" id="info">
<tr>
<th>Row 1, Col 1</th>
<th>Row 1, Col 2</th>
</tr>
<tr>
<td>Row 2, Col 1</td>
<td>Row 2, Col 2</td>
</tr>
</table>
<div>Some Contents<div>
<div>Some Contents<div>
</body>
</html>

توی کد فوق، ممکنه تعداد divها یا کلاً محتوای قبل و بعد از جدول فرق کنه یا حتی محتوای جدول تغییر کنه، اما همیشه خط تعریف جدول بصورت <"table border="1px" id="info> باشه و ما هم محتویات رو از محل پیدا کردن این تگ تا اولین <table/> لازم داریم. خوب اینجا جدول رو میتونیم اینطوری استخراج کنیم:


<?php
$example = file_get_contents('http://example.com');
// Remove contents before table
$example = substr($example, 0, strpos($example, '<table border="1px" id="info">');
// Remove contents after table (+8 is to include </table> in the extracted text)
$example = substr($example, 0, strpos($example, '</table>') + 8);
echo trim($example);
/*
* Output:
*
<table border="1px" id="info">
<tr>
<th>Row 1, Col 1</th>
<th>Row 1, Col 2</th>
</tr>
<tr>
<td>Row 2, Col 1</td>
<td>Row 2, Col 2</td>
</tr>
</table>
*/
?>

موفق باشید.

DR.HTML
چهارشنبه 24 اسفند 1390, 10:35 صبح
ممنون بابت توجهتون کد من الان شده این <?php
$example = file_get_contents('http://www.ff.com');
$example = substr($example, strpos($example, '<table id="weekdays" width="100%" cellspacing="0" cellpadding="6" border="0">'));
$example = substr($example, 0, strrpos($example, '</table>'));
echo trim($example);
?>
اما بازم داره کل صفحرو چاپ میکنه مشکل از کجاست ؟

DR.HTML
شنبه 27 اسفند 1390, 01:12 صبح
اقا کسی جواب مارو بلد نبود ؟

MMSHFE
شنبه 27 اسفند 1390, 08:51 صبح
سایت ff.com برای من باز نشد که تست کنم. میشه خروجی که دریافت کردین رو برام اینجا بگذارین تا اصلاحات لازم رو توی کد انجام بدم؟

alismith
شنبه 27 اسفند 1390, 17:14 عصر
سلام

من مثال جناب شهرکی رو یکم تغییر دادم، فکر کنم اینطوری مشکلتون حل بشه :



<?php
$example = file_get_contents('url');
// Remove contents before table
$example = substr($example, strpos($example, '<table border="1px" id="info">'), strlen($example));
// Remove contents after table (+8 is to include </table> in the extracted text)
$example = substr($example, 0, strpos($example, '</table>') + 8);
echo trim($example);

?>



موفق باشید

DR.HTML
یک شنبه 28 اسفند 1390, 19:36 عصر
اقا من اون Ff که گزاشتم الکیه ! شما هرچی بزارین جواب نمیده ! کل صفحرو چاپ میکنه !

DR.HTML
یک شنبه 28 اسفند 1390, 19:48 عصر
سلام

من مثال جناب شهرکی رو یکم تغییر دادم، فکر کنم اینطوری مشکلتون حل بشه :



<?php
$example = file_get_contents('url');
// Remove contents before table
$example = substr($example, strpos($example, '<table border="1px" id="info">'), strlen($example));
// Remove contents after table (+8 is to include </table> in the extracted text)
$example = substr($example, 0, strpos($example, '</table>') + 8);
echo trim($example);

?>



موفق باشید
این چیزی که شما دادی دوست من اون قسمترو که ممن میخوام حذف کرد شما نگاه کنینن

<?php
$example = file_get_contents('http://www.forexfactory.com');
// Remove contents before table
$example = substr($example, strpos($example, '<table id="weekdays" width="100%" cellspacing="0" cellpadding="6" border="0">'), strlen($example));
// Remove contents after table (+8 is to include </table> in the extracted text)
$example = substr($example, 0, strpos($example, '</table>'));
echo trim($example);

?>

alismith
یک شنبه 28 اسفند 1390, 23:01 عصر
سلام دوست عزیز

من این کد رو نوشتم فایل ساخته شد، اما در خوندنش مشکل دارم، شما خودت تست کن ببین کار می کنه؟

جناب شهرکی هم یک راهنمایی کنند خیلی ممنون میشم


$contents = array();
$example = file_get_contents('http://www.forexfactory.com');
$ff=fopen("ff.txt","w+");
fwrite($ff,$example);
while(!feof($ff)){

$contents[]=fgets($ff);

}

fclose($ff);

$start = false;
$table = array();

foreach($contents as $k => $v){

if(!$start){
if(strstr($v,'<table id="weekdays" width="100%" cellspacing="0" cellpadding="6" border="0">')){

$start = true;
$table[] = $v;

}
}else{

if(!strstr($v,'</table>')){

$table[] = $v;

}else{

$table[] = '</table>';

}


}

}


foreach($table as $key => $line){

echo $line."\n<br/>";

}




موفق باشید

MMSHFE
دوشنبه 29 اسفند 1390, 10:14 صبح
دوست عزیز، وقتی فایل رو باز میکنید، حتی اگه در وضعیت +w باشه، با هربار عمل نوشتن، اشاره گر داخل فایل به انتهای محل نوشتن اشاره میکنه و بنابراین، وقتی دستور fgets رو نوشتین، از اونجا به بعد رو میخواد بخونه. بجای این کار، فایل رو در وضعیت w باز کنید و بعد از نوشتن، ببندید و دوباره در وضعیت r باز کنید تا بتونید از ابتدا اون رو بخونید. البته بجای بازکردن در وضعیت w، نوشتن و بستن، استفاده از file_put_contents رو پیشنهاد میکنم. موفق باشید.

MMSHFE
دوشنبه 29 اسفند 1390, 11:16 صبح
این کد رو ببینید:


<?php
$contents = file_get_contents('http://www.forexfactory.com');
$style = <<<EOT
<style type="text/css">
.cal_imp_low, .cal_imp_medium, .cal_imp_high, .cal_imp_holiday
{
margin-top: 1px;
height: 15px;
width: 20px;
overflow: hidden;
}

.cal_imp_low
{
background: url(images/calendar_impact_low.gif);
}

.cal_imp_medium
{
background: url(images/calendar_impact_medium.gif);
}

.cal_imp_high
{
background: url(images/calendar_impact_high.gif);
}

.cal_imp_holiday
{
background: url(images/nonec.gif);
}
</style>
EOT;
$contents = substr($contents, strpos($contents, '<table id="weekdays" cellpadding="6" cellspacing="0" border="0" width="100%">'));
$contents = $style.PHP_EOL.$contents;
echo $contents;
?>

البته برای اجرای این کد، باید فایلهای زیر رو دانلود کرده و توی پوشه images در کنار فایلتون قرار بدین:
http://www.forexfactory.com/images/misc/calendar_impact_low.gif
http://www.forexfactory.com/images/misc/calendar_impact_medium.gif
http://www.forexfactory.com/images/misc/calendar_impact_high.gif
http://www.forexfactory.com/images/misc/nonec.gif
نمونه خروجی:
84418
دوست گرامی، روش کلی کار رو من و سایر دوستان گفتیم. شما باید برحسب نیازتون، تغییرات لازم رو توی اون اعمال کنید. مثلاً در اینجا من دیدم عکسها بارگذاری نمیشه. بررسی کردم دیدم چند تا Style توی یکی از فایلهای قابل تعریف شده که مربوط به ستون تصاویر هست. اونها رو کپی کردم و در کنار اسکریپت گذاشتم و قالب سفارشی خودم رو اضافه کردم. ولی خودمونیم ها، این سایت چقدر بد نوشته شده. اصلاً تگ بستن tr آخر و جدول مربوطه رو نگذاشته، body و html رو هم نبسته!

alismith
دوشنبه 29 اسفند 1390, 12:08 عصر
جناب شهرکی خیلی ممنون میشم اگه به من بگید الان کجای کار من اشتباه هستش که باز هم هیچ مقداری برروی صفحه چاپ نمیشه؟


$contents = array();
$example = file_get_contents('http://www.forexfactory.com');
file_put_contents("ff.txt",$example);
$ff=fopen("ff.txt","r");
//fwrite($ff,$example);
fseek($ff,0);
while(!feof($ff)){

$contents[]=fgets($ff);

}

fclose($ff);

$start = false;
$table = array();

foreach($contents as $k => $v){

if(!$start){
if(strstr($v,'<table id="weekdays" width="100%" cellspacing="0" cellpadding="6" border="0">')){

$start = true;
$table[] = $v;

}
}else{

if(!strstr($v,'</table>')){

$table[] = $v;

}else{

$table[] = '</table>';

}


}

}


foreach($table as $key => $line){

echo $line."\n<br/>";

}



و یک سوال دیگه اینکه وقتی از file_put_contents برای نوشتن در فایل استفاده کردم نسبت به روش قبلی حجم فایل بیشتر شد، دلیل خاصی داره؟



با تشکر

MMSHFE
دوشنبه 29 اسفند 1390, 12:35 عصر
<?php
$example = file_get_contents('http://www.forexfactory.com');
file_put_contents('ff.txt', $example);
$contents = file('ff.txt');
$start = false;
$table = array();
foreach($contents as $k => $v){
if(!$start) {
if(strstr($v, '<table id="weekdays" width="100%" cellspacing="0" cellpadding="6" border="0">') !== false) {
$start = true;
$table[] = $v;
}
}
else {
if(strstr($v, '</table>') !== false) {
$table[] = $v;
}
else {
$table[] = '</table>';
}
}
}
foreach($table as $key => $line) {
echo $line.PHP_EOL;
}
?>

به عملگر ==! در شرطها دقت کنید: برای مقایسه با false یا true بهتره از این عملگر استفاده بشه چون در حالت عادی اگه خروجی یک تابع 0 باشه یا یک رشته خالی، باز هم معادل false درنظر گرفته میشه ولی عملگر مذکور نوع رو هم چک میکنه. البته پیشنهاد میکنم از strpos بجای strstr استفاده کنید چون سریعتره و مصرف حافظه کمتری هم داره چون فقط یک عدد (محل پیدا شدن) یا false (درصورت پیدا نشدن) برمیگردونه ولی strstr از محل پیدا شدن رشته تا انتهای رشته اصلی رو برمیگردونه. موفق باشید.

MMSHFE
دوشنبه 29 اسفند 1390, 12:40 عصر
درمورد حجم بیشتر فایل نگران نباشید چون file_put_contents هدرهای استاندارد فایل رو اضافه میکنه ولی fopen در وضعیت w یک فایل با حجم 0 میسازه. ضمناً برای کارهایی مثل خوندن سطر به سطر و ریختن توی آرایه، راههای ساده تری مثل استفاده از تابع file هم هست. بعلاوه استفاده از file_put_contents به شما امکان تولید فایلهای یونیکد هم میده.
مثال برای ساخت فایل با کدگذاری UTF-8 without BOM :


<?php
$myFile = 'test.txt';
$myContent = 'I love PHP';
file_put_contents($myFile, utf8_encode($myContent));
?>

مثال برای ساخت فایل با کدگذاری UTF-8 :


<?php
$myFile = 'test.txt';
$myContent = 'I love PHP';
file_put_contents($myFile, "\xEF\xBB\xBF".utf8_encode($myContent));
?>

موفق باشید.

alismith
دوشنبه 29 اسفند 1390, 13:38 عصر
خیلی ممنون جناب شهرکی از توضیحات کاملی کد دادید، اما نمیدونم چرا با اینکه کد شمه هم اجرا کردم هیچ چیزی روی صفحه چاپ نشد!

یک سوال این شرط :


if(strstr($v, '</table>') !== false)

نباید به این شکل باشه مهندس؟ :


if(strstr($v, '</table>') === false)



با تشکر

MMSHFE
دوشنبه 29 اسفند 1390, 20:36 عصر
نه دیگه، داریم میگیم اگه پیدا شد، نه اگه پیدا نشد! با strpos هم تست کردین؟

DR.HTML
چهارشنبه 16 فروردین 1391, 16:50 عصر
ببخشید جناب شهرکی من تاپیک رو بالا میارم من خودم کدم رو درست کردم اما شما مطمئنی همچین نتیجه ای از کدی که دادید گرفتید ؟
من هم روی لوکال هم روی هاست تست کردم بازم کل صفحرو چاپ کرد

MMSHFE
چهارشنبه 16 فروردین 1391, 17:15 عصر
الآن چک کردم سایتشون تغییر کرده. کد جدید رو تا امشب میگذارم. موفق باشید.

DR.HTML
چهارشنبه 16 فروردین 1391, 20:20 عصر
من با css قسمتهاییو که نخواستم حذف کردم اما اگر شما کد بزارید خیلی بهتره ممنون!

MMSHFE
چهارشنبه 16 فروردین 1391, 22:50 عصر
با سلام، فایل اصلاح شده رو ضمیمه کردم. این فایل اسکریپتهای JS اضافه و... رو هم حذف میکنه. موفق باشید.