روشن فکری بنیان ماست !

ما هرگز نمی گذاریم حوصله شما سربرود !

اللَّهُ نُورُ السَّمَاوَاتِ وَالْأَرْضِ مَثَلُ نُورِهِ کَمِشْکَاةٍ فِیهَا مِصْبَاحٌ الْمِصْبَاحُ فِی زُجَاجَةٍ الزُّجَاجَةُ کَأَنَّهَا کَوْکَبٌ دُرِّیٌّ یُوقَدُ مِن شَجَرَةٍ مُّبَارَکَةٍ زَیْتُونِةٍ لَّا شَرْقِیَّةٍ وَلَا غَرْبِیَّةٍ یَکَادُ زَیْتُهَا یُضِیءُ وَلَوْ لَمْ تَمْسَسْهُ نَارٌ نُّورٌ عَلَی نُورٍ یَهْدِی اللَّهُ لِنُورِهِ مَن یَشَاءُ وَیَضْرِبُ اللَّهُ الْأَمْثَالَ لِلنَّاسِ وَاللَّهُ بِکُلِّ شَیْءٍ عَلِیمٌ ( برخی از خواص آینه ۳۵ سوره نور از کتاب قرآن کریم )
هرگونه کپی برداری از فایل های اختصاصی پیگرد قانونی دارد لذا در صورت کپی مطالب لینک دریافت آن ها را تغییر ندهید .
روشن فکری بنیان ماست !

به نام او که یادش ترنم عارفانه زندگیست . سلام من سید امیرحسین طــاووســی هستم طــراح و برنامه نویس وب . فـعالیتم را در زمینه کــامپـیوتـر قبل از سـال اول دبـسـتـان شـروع کــردم و تا دوره راهنمایی اطلاعات کاملی از این تکنولوژی بدست آوردم . از ان دوره تا کنون در زمینه های مختلف فعالیت می کنم که مهـم ترین آن برنامه نویسی وب است یکی از عواملی که باعث شد تا به این سمت بیام کـدباز بودن زبان های وب هستش و روز به روز به دانستنیهایم در این زمینه می افزایم. شاد و سرزنده باشید , امیر

جستجو در وبلاگ
آخرین نظرات

درصد پیشرفت پروژه ها

Projects Progress
اسکریپت اشتراک ویدیو + منتظر بزرگترین سوپرایز وبلاگ من در فروردین ۹۵ باشید۷۹ درصد

دریافت جزیات اسکریپت اشتراک ویدیو

معرفی کلاس SimpleHtmlDom

چهارشنبه, ۱۶ مهر ۱۳۹۳، ۰۸:۴۸ ب.ظ

شب سرد پاییزیتون بخیر همین الان داشتم به آسمان خدا نگاه می کردم ، پسر فوق العاده بود قرمز و سرد عاشقشم . خوب بگذریم یه معرفی خوب و کامل بدم و برم سر درس دیفرانسیل خودم . حتما شما هم خیلی دوست دارید از وبسایت های مختلف متن ها و جزیات خاصی را دریافت کنید و اون سایت هیچ واسط برنامه نویسی (API) برای خودش تعریف نکرده است خوب مشکی وجود ندارد بلکه کار اصلی این کلاس بیرون کشیدن جزیات از داخل کدهای استاتیک می باشد برای مثال من می خواهم VALUE یه INPUT در سایت GOOGLE>COM را دریافت کنم خوب با عقل جور درمیاد که اول باید با توابعی چون file_get_contents کدهای استاتیک را دریافت کنیم و بعدش این کلاس این کارو انجام می دهد هر چند همین کلاس تابع مشابه همین تابع معرفی کرده است که از آن بهره می گیرد . کار این کلاس به همینجا به پایان نمی رسد بلکه در همین زمینه شما هر کار که خواستید می توانید انجام بدهید مثلا تمام لینک های تگ تصاویر را در صفحه دریافت کنید خوش بختانه به کمک Array می توانید هر کاری که خواستید انجام دهید خوب زمانی که به معرفی تخصصی کلاس بپردازیم کامل متوجه کارایی این کلاس می شوید . معرفی در ادامه مطلب .

خوب ابتدا کلاس را فراخوانی می کنیم و کار را با یک مثال آغاز میکنیم :

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images 
foreach($html->find('img') as $element) 
       echo $element->src . '<br>';

// Find all links 
foreach($html->find('a') as $element) 
       echo $element->href . '<br>';

خوب می بینید که در ابتدا متغیر $html در حال دریافت سورس استاتیک google.com می باشد . شما می توانید حتی تابع file_get_html را حذف کنید و کامل کد استاتیک را در متغیر قرار بدید اکنون کد فعلی برای دریافت سورس سایت ها می باشد . خوب بعد از دریافت سورس ما می توانیم دستور بدهیم که چه اطلاعاتی را برایمان تهیه کند برای مثال با تابع foreach ما نوشتیم که تگ های img را بگیر و سپس المنت src را نمایش بده و با <br> آخر آن بعد از اجرا لینک تمام عکساهای موجود در آن صفحه در هر خط ظاهر می شوند . یا کد دوم که در بین تگ های a المنت href آن ها را دریافت می کند و در هر خط نمایش می دهد . حالا با چند حالت مختلف برای لود سورس اولیه قبل انواع درخواست کار را ادامه می دهیم به کدهای زیر دقت کنید :

// راه های سریع برای دریافت سورس
// Create a DOM object from a string
$html = str_get_html('&lt;html&gt;&lt;body>Hello!&lt;/body&gt;&lt;/html>');
// Create a DOM object from a URL
$html = file_get_html('http://www.google.com/');
// Create a DOM object from a HTML file
$html = file_get_html('test.htm');

// ساخت آبجکت // Create a DOM object $html = new simple_html_dom(); // Load HTML from a string $html->load('&lt;html&gt;&lt;body>Hello!&lt;/body&gt;&lt;/html>'); // Load HTML from a URL $html->load_file('http://www.google.com/'); // Load HTML from a HTML file $html->load_file('test.htm');

همان طور که دید به روش های بالا می شود سورس را دریافت کرد توجه داشته باشید راه های دسترسی سریع و ساخت OBject با هم متفاوت هستند با توجه به نیازتان باید استفاده کنید هر دو مدل را در یک فایل نمیشه استفاده کرد من به دلیل کمبود جا هر دو نوع را در یک پنجره قرار دادم . خوب بریم سر یک مثال : مثلا من می خواهم از سایت bayan.blog.ir تیتر ، تاریخ و پست ها صفحه اصلیش را دریافت کنم ابتدا با view source کردن سایت نگاهی به تگ های استاتیک اطراف پست ها میندازم : 

خوب با توجه به توضیحی که در بالا دادم بعد از فراخوانی کلاس می توانیم از کد زیر استفاده کنیم :

// Create DOM from URL
$html = file_get_html('http://bayan.blog.ir/');

// Find all article blocks
foreach($html->find('div.PostWrap') as $article) {
    $item['title']     = $article->find('div.PostTitle', 0)->plaintext;
    $item['intro']    = $article->find('div.PostDate', 0)->plaintext;
    $item['details'] = $article->find('div.PostContent', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

خوب چند نکته تکمیلی لازم است تا بیان شوند اگه به array ها تسلط داشته باشید هیج جای این کد شک برانگیز نیست اما نحوه تایپ در تابع find این کلاس دقیقا مشابه نحوه تایپ در پیدا کردن دیتایی در jQuery می باشد برای مثال سختش می کنیم اگر در تابع نوشته شود [div[id سیستم به دنبال تگ های div می گردد که دارای المنت id باشند چه خالی و چه پر خوب حالا کمی تغییر می دهیم مثلا [div[id=tavousi خوب حالا دقیقا مثل قبلیست ولی اگر المنت وجود داشت و مقدار آن tavousi بود پیدا می شود . در این قسمت تنوع بسیار است و برای مسلط شدن باید به مستندات انگلیسی سیستم مراجعه کنید هر چند که کاملا مشابه پیداکردن مقدار در jQuery هست . خوب ما در مورد کار با تابع foreach زیاد سخن گفتیم حالا به دریافت فقط یک دیتا و چند دیتا با کد هاس ساده کلاس می پردازیم :

// پیدا کردن تمام تگ های لینکی و نمایش به صورت
// Array
$ret = $html->find('a');
// توضیحات در متن 
$ret = $html->find('a', 0);
// توضیحات در متن 
$ret = $html->find('a', -1); 
// توضیحات در متن 
$ret = $html->find('div[id]');
// توضیحات در متن 
$ret = $html->find('div[id=foo]'); 

خوب در ابتدا متذکر شوم که اگر دیتا بیش از یک مورد باشد به صورت array اطلاعات بر میگردد اما کد های بالا کاملا واضح هستند اما در مورد عدد 0 و 1- که دومین متغیر تابع find این کلاس را تشکیل می دهند توضیحاتی کوتاه عرض کنم . در اصل این عدد به این معناست که مثلا اگر تگ های a را پیدا کرد ما مشخص کنیم سومین تگ a را در صفحه از ابتدا به انتها پیدا کند و خروجی یکی بیشتر نیست اگه اشتباه نکرده باشم عدد 0 به معنای اولین و خود 1 به معنای دومین مورد می باشد و بقیه اعداد که دیگه مشخص است اما 1- به معنای پیدا کردن آخرین مورد در صفحه می باشد . کارایی این کلاس زیاد است پس به چند نکته اساسی دیگر بسنده می کنم . کد زیر نیز کارایی کد بالا را دارد اما پیچیده تر با هم نگاهی به کد زیر میندازیم :

// Find all element which id=foo
$ret = $html->find('#foo');

// Find all element which class=foo
$ret = $html->find('.foo');

// Find all element has attribute id
$ret = $html->find('*[id]'); 

// Find all anchors and images 
$ret = $html->find('a, img'); 

// Find all anchors and images with the "title" attribute
$ret = $html->find('a[title], img[title]');

خوب همان طور که مشخص هست با کمک کاما (,) در متغیر اول تابع find می توانی چند درخواست وارد کنیم و بقیه موارد مشخص هست و همچنین با قرار دادن ستاره * به معنی این است که نام تگ مهم نیست فقط اگر دارای المنت id بود پیدا کند . خوب در زمینه پیدا کردن دیتا به چند مثال بالا بسنده می کنیم بعد از مطالعه این پست حتما مستندات انگلیسی سیستم را مطالعه کنید . خوب حالا به سراغ تغییر در دیتا ها می رویم به این شکل که دیتا صفحه با نظر ما تغییر می کند و نمایش داده می شود به مثال زیر دقت کنید :

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output:<div id="hello">foo</div><div id="world" class="bar">World</div>

همان طور که مشاهده می کنید با دادن دیتا به المنت های innertext و class می توان آن ها را تغییر داد نام های این قسمت نیاز به توضیح نیست چون مشابه jQuery نوشته شده است . و یک مثال هم از Dome tree :

// If you are not so familiar with HTML DOM, check this link to learn more... 
// Link : http://php.net/manual/en/book.dom.php

// Example
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// or 
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');

نیاز به توضیح فارسی نیست کاملا مشخص هست و هیچ مشکلی دیگر در دریافت اطلاعات دقیق با Dom tree پیش نخواهد آمد در انتها نگاهی کلی به توابع بخش های مختلف داشته باشیم و معرفی منابع :

من سید امیرحسین طــاووســی هستم طــراح و برنامه نویس وب . فـعالیتم را در زمینه کــامپـیوتـر قبل از سـال اول دبـسـتـان شـروع کــردم و تا دوره راهنمایی اطلاعات کاملی از این تکنولوژی بدست آوردم . از ان دوره تا کنون در زمینه های مختلف فعالیت می کنم که مهـم ترین آن برنامه نویسی وب است یکی از عواملی که باعث شد تا به این سمت بیام کـدباز بودن زبان های وب هستش و روز به روز به دانستنیهایم در این زمینه می افزایم. شاد و سرزنده باشید .

رمز فایل ها در بیان باکس : tavousi.name

در صورت مشکل در دانلود فایل ها و یا حذف شدن آن ها ما را مطلع نمایید .

نظرات  (۲)

دروووووووووووووووووود بر شما

کارتون عالی بود

سپاس گزارم
سلام اقا من تست کردم ارور میدهد 

Warning: file_get_contents(): stream does not support seeking in D:\xampp\htdocs\kosar\simple_html_dom.php on line 92

Warning: file_get_contents(): Failed to seek to position -1 in the stream in D:\xampp\htdocs\kosar\simple_html_dom.php on line 92

Fatal error: Uncaught Error: Call to a member function find() on boolean in D:\xampp\htdocs\kosar\page_news.php:7 Stack trace: #0 {main} thrown in D:\xampp\htdocs\kosar\page_news.php on line 7

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی