سلام
آموزش قبلی که درباره شروع کدنویسی با phpQuery بود و خب کلیات استفاده از phpQuery همون بود.
اما مهم تر از اون تکنیک ها و نکاتی هست که توی این کتابخونه جادویی وجود داره.
خب توی jQuery و CSS وقتی میخوایم اولین عضو رو انتخاب کنیم، جلو سلکتور :first-child رو مینویسم و همه چی حل میشه. این روش گاهی توی phpQuery جواب میده، گاهی هم نه(نمیدونم چرا، من تجربی یاد گرفتم و خیلی از چیزا دلیلش رو نمیدونم). خلاصه اینکه الان چنتا روش انتخاب اولین عضو(فرزند) رو اینجا نوشتم که اگه یکیش کار نکرد اون یکی کار میکنه. شایدم همش کار کنه د:
اول از همه دوباره بگم تمام روش هایی که گفتم تجربی هست و اگه یکیش براتون جواب نداد بعدی رو تست کنید.
فرض کنید میخوایم لینک آخرین گوشی سامسونگ که به توی دسته بندی دیجیکالا اضافه شده رو انتخاب کنیم.
خب بخشی از کد جلسه قبل رو می نویسیم:
<?php // Include phpQuery include_once( "phpQuery/phpQuery.php" ); // Get page source $html = file_get_contents( "https://www.digikala.com/search/category-mobile-phone/?q=%D8%B3%D8%A7%D9%85%D8%B3%D9%88%D9%86%DA%AF&entry=mm" ); // Init phpQuery phpQuery::newDocumentHTML( $html ); $links = ""
میدونید دیگه میشه توی foreach از عملگر break استفاده کرد. پس وقتی برای یه بار حلقه رو رفت، دستور break میزاریم که از حلقه بیاد بیرون.
همیشه برای حل یه مسئله چندین روش وجود داره. توی تمام این روش هایی که نوشتم هم میتونید از pq() استفاده کنید هم از آرایه $doc .
foreach( pq( ".c-listing .c-listing__items li a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); break; }
foreach( $doc[ ".c-listing .c-listing__items li a.c-product-box__img" ] as $product_link ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); break; }
استفاده از تابع pq()
foreach( pq( ".c-listing .c-listing__items li:first-child a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
foreach( $doc[".c-listing .c-listing__items li:first-child a.c-product-box__img"] as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
با تابع eq() شما میتونید بهش بگید چندمین عضو(فرزند) رو انتخاب کنه. اولین فرزند هم از 0 شروع میشه. این تابع رو هم توی jQuery داریم.
تابع find() همونطور که از اسمش معلومه و توی jQuery هم داریم، کارش پیدا کردن یه سلکتور خاصه. برای این روش هم میتونم کد رو به چند صورت بنویسیم:
foreach( pq( ".c-listing .c-listing__items li" )->eq( 0 )->find( "a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
foreach( $doc[".c-listing .c-listing__items li"]->eq( 0 )->find( "a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
کار تابع filter() مثل تابع filter() توی jQuery هست. و میشه کارهای خاصی روی سلکتور انجام داد.
foreach( pq( ".c-listing .c-listing__items li" )->filter( ":first" )->find( "a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
foreach( $doc[".c-listing .c-listing__items li"]->filter( ":first" )->find( "a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
میتونید روش ها رو با هم ترکیب هم کنید. مثلا میشه :first-child رو با find() هم ترکیب کرد:
foreach( pq( ".c-listing .c-listing__items li:first-child" )->find( "a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
foreach( $doc[".c-listing .c-listing__items li:first-child"]->find( "a.c-product-box__img" ) as $product_a ) { $link = "https://www.digikala.com" . pq( $product_a )->attr( "href" ); }
خب امیدوارم این آموزش هم براتون مفید باشه و حداقل مشکلی رو حل کرده باشه د: