۴ سیدرضا بازیار
درخواست راهنمایی در درک ایجاد یک شی php
جامعه پی اچ پی ایجاد شده در ۰۸ اسفند ۱۴۰۰

سلام. یک کد نوشتم واسه اسکرپینگ که میره از یه سایت عناوین خبر رو میگیره...

یه قسمت از کد رو در هنگام مطالعه یه کتاب قدیمی، از اونجا برداشتم. اما درکش برام سخته. اگه ممکنه راهنمایی کنید

function returnXPathObject($item) 
{
    $xmlPageDom = new DomDocument();
    @$xmlPageDom->loadHTML($item);
    $xmlPageXPath = new DOMXPath($xmlPageDom); 
    return $xmlPageXPath;
}

در این کد قسمت $item سورس یه صفحه وب وارد تابع میشه. ابتدا یک شی ایجاد میکنه و کد رو لود میکنه و دوباره شی ایجاد میکنه.

دقیقا نقش اون @ چیه؟ در مباحث پایه php سون‌لون این رو یاد گرفتم. ولی در اینجا درکش برام سخته

چه لزومی داره که دوباره دوتا شی new بشه؟ نمیشد با همون اولی کار رو تموم کرد؟

میشه با یه روش بهتر این کد رو نوشت؟

مورد بعد هم در کد پایین:

$title = $PageXpath->query('//h1'); // Querying for H1 tag

وقتی میخوایم یه کوئری بزنیم چرا از // قبل از اون استفاده میشه؟

یا در جایی دیدم اینجوری یه کلاس رو نوشته:

//div[@class="bpright"]/div[@class="author"]/a

نوشتن کلاس‌ها و آی دی‌ها و تگ‌ها و... در یک کوئری واسه دریافت اون در اسکرپینگ (با این روش که در php نوشته میشه) جزو چه مبحثی هست و واسه تسلط روی اون باید چه مبحثی رو مطالعه کنم؟

سلام دوست عزیز

@ اول خط برای نادیده گرفتن خطاها، اخطارها و اطلاعیه هایی هست که در اون خط اتفاق میفته!

علیت اینکه اول میایم یه شی از کلاس DomDocument را ایجاد میکنیم بعد سند html رو به اون پاس میدیم بعدش شیئمون رو به DOMXPath پاس میدیم به خاطر رعایت اصل dependency inversion از اصول solid هست و طبق دایکیومنت خود php کلاس DOMXPath حتما باید شیئی از نوع DomDocument دریافت کند.

public DOMXPath::__construct(DOMDocument $documentbool $registerNodeNS true)

درمورد // که گفتید، این معنی رو میده که تمامی تگ‌ها html که h1 هستند رو دریافت کنن

و / به این معنی که child نود دریافت شده قبلی

مثالی که خودتون فرستادید رو توضیح میدم

//div[@class="bpright"]/div[@class="author"]/a

در مثال بالا

  • ابتدا در // میاد تمام div هایی که در سند هستند و دارای ویژگی کلاس و مقدار bpright هستند رو دریافت میکنه
  • بعد در / میاد نودهای انتخاب شده به دنبال div میگرده که child نودهای بالا باشه و دارای ویژگی کلاس و مقدار author هستند رو دریافت میکنه
  • در / بعدی باز به همین شکل که child نودهای انتخاب شده در بالا دارای تگ a باشند

در مورد یادگیری هم مبحث خاصی نیست همین خط پایین رو ببینید کافیه

tag[@attribute ="value"]

مثالش هم در خط زیر براتون آوردم

<input name="email">
input[@name="email"]

پیشنهاد میکنم از 2 لینک زیر هم بازدید کنید!

https://www.php.net/manual/en/class.domdocument.php

https://www.php.net/manual/en/domxpath.query.php

در بحث وب اسکرپینگ دوره سون لرن رو هم میتونید ببینید

https://7learn.com/app/product/php-expert/item/889

اگر باز سوالی بود در خدمتم ?

محمد گازری ۰۹ اسفند ۱۴۰۰، ۰۴:۵۸

۱- در اینجا منظور از خطا‌ها و اخطار‌ها دقیقا چیه؟ اصلا لود شدن اون خطا‌ها چه مشکلاتی میتونه ایجاد کنه

۲- در این کد استفاده از «اصل وارونگی وابستگی» چه لزومی داره؟ یعنی نمیشد با روش خلاصه تر، در یک مرحله سورس رو دریافت کرد؟

۳- الان در دو مثال آخر که نوشتید، از // استفاده نشده. بحث من بر سر همین // هست. دلیل استفاده از این دو اسلش چی بوده؟ چون از query بیشتر واسه جستجو در دیتابیس استفاده میکردیم و توی اون دستورات mysql مینوشتیم

سیدرضا بازیار ۱۰ اسفند ۱۴۰۰، ۱۱:۱۱

با سلام مجدد

1- گاهی اوقات در صورت لود کردن سند html اگر تگ‌های اون سند از لحاظ syntax دارای مشکل باشه متد LoadHTML به ما خطایی مشابه خطای زیر نمایش میده:

Warning: DOMDocument::loadHTML(): error parsing attribute name in Entity

بنابراین با گذاشتن @ جلوی نمایش این خطا رو میگیریم (این روش مدیریت خطاها به هیچ وجه پیشنهاد نمیشه)

به عنوان مثال اگر @ را بردارید و کد زیر را به تابع پاس بدید خطایی دریافت نمیکنید: (برای سینتکس باید تصویر بذارم)

589d-Screenshot 2022-03-01 160001.png

اما اگر سینتکس رو خراب کنیم خطا دریافت میکنیم

78b5-problem.png

2- ببینید به صورت کلی بخوام بهتون بگم اینکه که کلاس فرزند نباید تعیین کنه که چی میخواد و تزریق وابستگی باید از بیرون به داخل باشه. و همینطور هرکدوم از این کلاس‌ها وظایف خودشون رو دارن. بنابراین در اینحا و با توجه به کلاس‌ها و متدهاشون رعایت اصول clean code در کلاس‌های زبان php لازم بوده!

توجه کنید که همیشه خلاصه نویسی بهترین راه نیست!

3- به نظرم مطاله جواب‌های این لینک میتونه براتون مفید باشه

https://stackoverflow.com/questions/36019544/if-double-slash-is-used-2-times-in-xpath-what-does-it-mean

بهترین پاسخ
محمد گازری ۱۰ اسفند ۱۴۰۰، ۱۲:۰۹

با تشکر از توضیحات خوب شما

یه کتاب اموزشی در این زمینه دانلود کردم و امروز کامل نشستم و خوندم و یه تصویر جالب هم توی اون بود که باعث شد به جواب سوال اخر هم برسم (تصویر رو پیوست میکنم)

f2d9-۷.png

سیدرضا بازیار ۱۰ اسفند ۱۴۰۰، ۱۹:۳۰