ჩვენ ვწერთ შინაარსის პარსერს PHP-ში. ვებ გვერდის გარჩევა და დამუშავება PHP-ში: საუკეთესო ბიბლიოთეკის არჩევა როგორ გავაანალიზოთ html გვერდი

PHP შინაარსის გვერდების გარჩევა

სტატია ეძღვნება ანალიზს, კერძოდ, ვებსაიტის ანალიზს, გვერდის ანალიზს, ვებ გვერდის ანალიზს, ვებსაიტის html შინაარსის ანალიზს.

სხვადასხვა ვებ სერვისების შემუშავების პროცესში ძალიან ხშირად ვხვდებით ამოცანებს, რომლებშიც საჭიროა სწრაფად მივიღოთ სხვადასხვა ტიპის ინფორმაცია დიდი მოცულობით. ეს ძირითადად დაკავშირებულია გატაცებასთან, ინფორმაციის ქურდობასთან, რაც გინდათ დაარქვით. საქმე იმაშია, რომ ინფორმაცია ხელმისაწვდომი და ღიაა. პარსინგის თავისებურება არის მონაცემთა და შინაარსის სწრაფი და ავტომატური შეგროვება ვებ გვერდებიდან.

დღესდღეობით ძალიან პოპულარულია ვებ-გარემოში სკრაპი, კერძოდ, საიტის გაფხეკა, რომელიც შეიცავს მინიმუმ გარკვეულ მნიშვნელობას და შესაბამისობას ხალხისთვის. განსაკუთრებული მნიშვნელობა აქვს პროდუქციის კატალოგს, მათ შორის სურათებს, დირექტორიათა მონაცემთა ბაზებს და სხვა, რაც შეიძლება სასარგებლო იყოს კონკურენტებისთვის.

შევეცადოთ გავაანალიზოთ საჭირო ინფორმაცია html-ში, ვცადოთ ყველა ბმული მივიღოთ ჩვენი საიტის რამდენიმე გვერდიდან.

პირველ რიგში, უნდა მივიღოთ საიტის შინაარსი html ფორმატში. ამისათვის ჩვენ უბრალოდ უნდა ვიცოდეთ საჭირო გვერდების მისამართები.

მე მსურს ვაჩვენო ვებგვერდის გვერდიდან შინაარსის მისაღებად ორი ძირითადი გზა:

უპირველეს ყოვლისა, მოდით მოვამზადოთ მასივი საჭირო გვერდის მისამართებით:

//3 ბმული ჩვენს საიტზე: $urls = array("http://hello-site..ru/games/");

ვარიანტი 1 - php ფუნქცია file_get_contents. ფუნქცია აბრუნებს html სტრიქონს, რომელსაც გავაანალიზებთ ბმულებად:

//ჩადეთ თითოეული ბმული ფუნქციაში file_get_contents foreach($urls როგორც $urlsItem)($out .= file_get_contents($urlsItem); //და დაამატეთ თითოეული გვერდის შინაარსი ხაზში) echo $out; //აქ არის სამივე გვერდის შინაარსი

ვარიანტი 2 - CURL. ბიბლიოთეკა, რომელიც მხარდაჭერილია php-ით და აქვს პარამეტრების დიდი ნაკრები, POST მოთხოვნიდან FTP-თან მუშაობამდე. მოდით განვიხილოთ სტანდარტული ზარი curl ბიბლიოთეკაში, რომელიც მოგვცემს საიტის შინაარსს:

foreach ($urls როგორც $urlsItem)( //გაატარეთ თითოეული ბმული ციკლში $output = curl_init(); //დაკავშირება curl curl_setopt($output, CURLOPT_URL, $urlsItem); //გააგზავნეთ გვერდის მისამართი curl_setopt($output, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($output, CURLOPT_HEADER, 0); $out .= curl_exec ($output); //ჩადეთ html შინაარსი ხაზში curl_close ($output); //დახურეთ კავშირი ) echo $out; //აქ არის სამივე გვერდის შინაარსი

ახლა ჩვენი $out ხაზი შეიცავს სამივე გვერდის შინაარსს. ასე რომ, მოდით პირდაპირ გადავიდეთ ჩვენი სტრიქონის ანალიზზე.

კიდევ ერთხელ, მინდა ვაჩვენო 3 ვარიანტი ჩვენი პრობლემის გადასაჭრელად: „მშობლიური“ მეთოდი PHP-ში, ჩაშენებული DOMDocument ბიბლიოთეკის და SimpleHTMLDOM ბიბლიოთეკის გამოყენებით.

1. php ფუნქცია აფეთქდა. ფუნქცია პოულობს მოძიებულ სიმბოლოს ან სტრიქონის ნაწილს და ყოფს მთელ სტრიქონს მასივის ელემენტებად.

ვიმეორებ, ჩვენ უნდა მივიღოთ a თეგის ყველა href ატრიბუტის მნიშვნელობები; ამისათვის ჩვენ დავყოფთ ზოგად სტრიქონს რამდენიმე ნაწილად\სეგმენტებად:

// აფეთქება $hrefs = აფეთქება("

თუ ჩვენ დავბეჭდავთ ჩვენს მასივს, ის ასე გამოიყურება:

მასივი ( => / => /გამარჯობა => /ტაიმერი/ => /მარცხენა მენიუ/ => /faq/ => /ბლოგი/ => /ვებ-შენიშვნები/ => /შეკვეთის საიტი/ => /თამაშები)

2. ჩაშენებული DODocument ბიბლიოთეკა. კლასთან ვმუშაობთ დაახლოებით შემდეგნაირად:

//domelement $dom = ახალი DODocument; //შექმენით ობიექტი $dom->loadHTML($out); //ჩატვირთვა შინაარსი $node = $dom->getElementsByTagName("a"); //მიიღეთ ყველა ტეგი a-სთვის ($i = 0; $i< $node->სიგრძე; $i++) ($hrefText = $node->item($i)->getAttribute("href"); //მიიღეთ href ატრიბუტი ტეგიდან) foreach($hrefText როგორც $hrefTextItem)( //მოიშორეთ ბმულები ცარიელი ატრიბუტით href if($hrefTextItem!="")( $clearHrefs=$hrefTextItem; ) ) $clearHrefs = array_unique($clearHrefs); //მოშორება იდენტური ბმულები print_r($clearHrefs); // ბოლოს გვაქვს მასივი ყველა ლინკით 3 გვერდიდან

ამ კოდის შედეგი ზუსტად იგივეა, რაც აფეთქების ფუნქციის გამოყენებისას.

3. მარტივი HTMLDOM ბიბლიოთეკა. ის უნდა იყოს ჩართული ფაილიდან. ნამუშევარი დაახლოებით DODOcument-ის მსგავსია. კლასთან მუშაობა:

//simplehtml include("simple_html_dom.php"); //შეიცავს ფაილს SimpleHTMLDOM კლასით $html = new simple_html_dom(); //შექმენით ობიექტი $html->load($out); //განათავსეთ ჩვენი შინაარსი $collection = $html->find("a"); //შეაგროვეთ ყველა ტეგი foreach($collection როგორც $collectionItem) ( $articles = $collectionItem->attr; //ყველა ატრიბუტის მასივი, href ჩათვლით) foreach($articles როგორც $articlesItem)( $hrefText = $articlesItem[ " href"]; //შეაგროვეთ მასივში ქვედა მასივის მნიშვნელობები საკვანძო href ) foreach($hrefText როგორც $hrefTextItem)( //გაათავისუფლეთ ბმულები ცარიელი href ატრიბუტით if($hrefTextItem!="" )( $clearHrefs=$hrefTextItem; ) ) $clearHrefs = მასივი_უნიკალური ($clearHrefs); //მოშორება იდენტური ბმულები print_r($clearHrefs); // ბოლოს გვაქვს მასივი ყველა ლინკით 3 გვერდიდან

ვიმეორებ, მასივში შედეგი ზუსტად იგივეა, რაც ზემოთ მოცემულ ორში.

ახლა, საიტის სამი გვერდიდან შეგროვებული ყველა ბმულით მასივის არსებობით, თქვენ შეგიძლიათ გაგზავნოთ ბმულები სწორი მიმართულებით, ეს ყველაფერი დამოკიდებულია დავალებაზე და ფანტაზიაზე. ასეთი შესაძლებლობების გათვალისწინებით, შეგიძლიათ გაანალიზოთ დიდი რაოდენობით მონაცემები სხვადასხვა ტიპის ინფორმაციის, სურათების, ტექსტების, ჟურნალების და ა.შ. სხვისი ინფორმაცია შენს ხელშია, განკარგე როგორც გინდა, მაგრამ დაიცავი თავი, თუმცა ეს შეუძლებელია)

მესამე მხარის საიტიდან საჭირო ინფორმაციის ანალიზისა და დამუშავების ამოცანას ვებ დეველოპერი საკმაოდ ხშირად და სხვადასხვა მიზეზის გამო აწყდება: ამ გზით თქვენ შეგიძლიათ შეავსოთ თქვენი პროექტი შინაარსით, დინამიურად ჩატვირთოთ გარკვეული ინფორმაცია და ა.შ.

ასეთ შემთხვევებში პროგრამისტს აწყდება კითხვა: ათეულობით ბიბლიოთეკიდან რომელი აირჩიოს? ამ სტატიაში შევეცადეთ გავითვალისწინოთ ყველაზე პოპულარული ვარიანტები და ავირჩიოთ საუკეთესო.

რეგულარული გამონათქვამები

მიუხედავად იმისა, რომ „ჩვეულები“ ​​პირველია რაც გახსენდებათ, არ უნდა გამოიყენოთ ისინი რეალური პროექტებისთვის.

დიახ, რეგულარული გამონათქვამები საუკეთესოდ ასრულებენ მარტივ ამოცანებს, მაგრამ მათი გამოყენება გაცილებით რთული ხდება, როდესაც საჭიროა HTML კოდის დიდი და რთული ნაწილის გაანალიზება, რომელიც, უფრო მეტიც, ყოველთვის არ ემთხვევა რომელიმე კონკრეტულ შაბლონს და შესაძლოა შეიცავდეს სინტაქსურ შეცდომებს. .

იმის ნაცვლად, რომ „დაასრულოთ“ თქვენი რეგულარული გამოთქმა კოდის ყოველი ოდნავი ცვლილებით, გირჩევთ გამოიყენოთ ქვემოთ მოცემული ხელსაწყოები - ეს უფრო მარტივი, მოსახერხებელი და საიმედოა.

XPath და DOM

htmlSQL

თუ არ იყენებთ PHP-ს, შეგიძლიათ გაეცნოთ მსგავსი ხელსაწყოების ამ მოკლე სიას სხვა პროგრამირების ენებისთვის.

ბოლო დროს ერთ კომპანიაში ვმუშაობ შპს "რადიო ქალაქი სახალინი"საინფორმაციო და გასართობი პორტალ „სიტისახის“ დეველოპერებისა და ჟურნალისტების გუნდში. განსაკუთრებით ფეხბურთის გულშემატკივრებისთვის, პორტალი მხარს უჭერს "სპორტის" განყოფილებას ფეხბურთის სამყაროს სიახლეებით, პოზიციებით და FC Sakhalin გუნდის მოთამაშეთა სიით.

პორტალი ამჟამად რედიზაინს გადის, ამიტომ მე დამინიშნეს „სპორტის“ განყოფილების მართვა. ჩემი მთავარი ფუნქცია გუნდში არის ახალი დიზაინის განლაგების განლაგება. ხანდახან გვიწევს გვერდითი პრობლემების გადაჭრა, რათა ჩვენი მთავარი პროგრამისტის ისედაც რთული სამუშაო გავუადვილოთ. დღეს ვისაუბრებ მიკროპარსერზე.

მანამდე პორტალზე საფეხბურთო ტურნირების ცხრილებს კონტენტ მენეჯერები ხელით ავსებდნენ. არის შემთხვევები, როდესაც მატჩების შედეგები Championship.com-ზე უფრო სწრაფად გამოჩნდა, ვიდრე ჩვენს პორტალზე. ახლა ჩვენ საბოლოოდ გადავწყვიტეთ გავხადოთ ცხრილის განახლება ავტომატური. ვინაიდან Championship.com არ გთავაზობთ API-ს (მინიმუმ რამდენიმე ღიას) მის მიერ ნაჩვენები ტურნირის ცხრილების მოსაპოვებლად, ერთადერთი ვარიანტია ანალიზი.

როგორ გამოვიყენოთ მიკროპარსერი

„მიკროპარსერი“ შედგება მხოლოდ ერთი ფუნქციისგან - parse_site(მასივი $sites, მასივი $defaults = array()) . პირველი არგუმენტი არის საიტების მასივი (ან გვერდები ერთ საიტზე), რომლებიც უნდა გაანალიზდეს, ხოლო მეორე არის ნაგულისხმევი პარამეტრების მასივი.

$sites მასივს აქვს შემდეგი ფორმატი:

მასივი("zona_vostok" => მასივი("url" => "http://www.championat.com/football/_russia2d/589/table/all.html", "xpath" => "some/x/path" , //სურვილისამებრ "xsl" => "absolute/path/to/xsl", //სურვილისამებრ), "stackoverflow" => მასივი ("url" => "http://stackoverflow.com", "xpath" = > "ზოგიერთი/x/გზა", "ტრანსფორმაცია" => მცდარი //სურვილისამებრ));

ყველა გასაღები url-ის გარდა არჩევითია. თუ XPath გამოთქმა აკლია, url გასაღების მნიშვნელობაში მითითებული გვერდი მთლიანად დამუშავდება. XSL სტილის ფურცელი ასევე შეიძლება იყოს ჩართული მხოლოდ იმ შემთხვევაში, თუ საჭიროა ნედლი კოდის დამუშავება.

ყურადღება მიაქციეთ "transform" => false კლავიშს. იგი გამოიყენება, როდესაც $defaults მასივი შეიცავს ნაგულისხმევი XSL სტილის ფურცელს, მაგრამ ტრანსფორმაცია არ არის აუცილებელი მოცემული გვერდისთვის.

$defaults მასივი თავს არიდებს პარამეტრების კოპირებას $sites მასივში. ის შეიძლება შეიცავდეს მხოლოდ ორ კლავიშს: xpath და xsl. სხვა გასაღებები უბრალოდ იგნორირებულია.

Შემაჯამებელი

ჩემს მიერ დაწერილი პარსერი შედგება ერთი ფუნქციისგან ორი პარამეტრით (პირადი და ზოგადი პარამეტრებისთვის), საშუალებას გაძლევთ ჩატვირთოთ მთელი გვერდი ან მისი ცალკეული ფრაგმენტი და ასევე, სურვილის შემთხვევაში, დაამუშავოთ შედეგი XSL სტილის ფურცლით.

თავიდან მინდოდა გამომეყენებინა ისეთი ბიბლიოთეკა, როგორიც არის phpQuery ან Ganon კვანძების გასავლელად, მაგრამ შემდეგ კარგად დავფიქრდი და მივხვდი, რომ ზედმეტი დამოკიდებულებების გადატანას აზრი არ ჰქონდა - შეგიძლიათ გამოიყენოთ უკვე არსებული, ჩაშენებული ინსტრუმენტი.

სამუშაო მაგალითი

ვნახოთ რუსეთის საფეხბურთო ჩემპიონატის სატურნირო ცხრილში მეორე დივიზიონში, ზონა „აღმოსავლეთი“.

მას შემდეგ, რაც ჩვენ გვჭირდება ტურნირის ცხრილის „გაყვანა“ პირდაპირ გვერდიდან, XPath გამოხატულება იქნება შემდეგი: //div[@id="section-statistics"]/table

წყაროს ცხრილი შეიცავს უამრავ ნაგავს: ატრიბუტებს, კლასებს, ინლაინ სტილებს. ასე რომ, ჩვენ მას უფრო ლამაზ იერს მივცემთ XSL სტილის ფურცლის გამოყენებით შემდეგი შინაარსით:

გუნდი თამაშები გამარჯვება ამახვილებს Დანაკარგები ბურთები Სათვალე
თუნდაც უცნაური

ახლა მოდით დავწეროთ კოდი დასრულებული ტურნირის ცხრილის საჩვენებლად.

$results = parse_site(array("zona_vostok" => მასივი("url" => "http://www.championat.com/football/_russia2d/589/table/all.html", "xpath" => "xpath " => "//div[@id="section-statistics"]/table", "xsl" => __DIR__."/football.xsl")); ბეჭდვა $results["zona_vostok"];

და გამომავალი არის შემდეგი HTML კოდი:

...
გუნდი თამაშები გამარჯვება ამახვილებს Დანაკარგები ბურთები Სათვალე
1 ლუჩ-ენერგია 20 12 6 2 30-17 42
2 ჩიტა 20 12 5 3 28-14 41

ჩამოტვირთეთ "Microparser"

აქ მოცემულია რამდენიმე გზა მიკროპარსერზე წვდომისთვის:

  1. ჩანგალი Github-ზე: git clone https://github.com/franzose/microparser.git
  2. ჩამოტვირთეთ არქივი:

ბევრ თქვენგანს აქვს კითხვები PHP-ში პარსერის შექმნა. მაგალითად, არის ვებსაიტი და მისგან შინაარსი უნდა მიიღოთ. დიდი ხნის განმავლობაში არ მინდოდა ამ სტატიის დაწერა, რადგან მასში კონკრეტული მნიშვნელობა არ არის. რომ გააკეთეთ პარსერი PHP-ში, თქვენ უნდა იცოდეთ ეს ენა. და ვინც მას იცნობს, უბრალოდ არ დასვამს ასეთ კითხვას. მაგრამ ამ სტატიაში მე გეტყვით, თუ როგორ იქმნება პარსერები ზოგადად და ასევე კონკრეტულად რა არის შესასწავლი.

ასე რომ, აქ არის პუნქტების სია, რომლებიც უნდა გაიაროთ იმისათვის შექმენით შინაარსის პარსერი PHP-ში:

  1. მიიღეთ გვერდის შინაარსი და ჩაწერეთ იგი სიმებიანი ცვლადი. უმარტივესი ვარიანტია ფუნქცია file_get_contents(). თუ კონტენტი ხელმისაწვდომია მხოლოდ ავტორიზებული მომხმარებლებისთვის, მაშინ ყველაფერი გარკვეულწილად უფრო რთულია. აქ ჩვენ უნდა შევხედოთ რა არის ავტორიზაციის მექანიზმი. შემდეგი, გამოყენებით cURL, გაგზავნეთ სწორი მოთხოვნა ავტორიზაციის ფორმაზე, მიიღეთ პასუხი და შემდეგ გაგზავნეთ სწორი სათაურები (მაგალითად, მიღებული სესიის იდენტიფიკატორი) და ასევე იმავე მოთხოვნაში შედით საჭირო გვერდზე. შემდეგ ამ პასუხში მიიღებთ საბოლოო გვერდს.
  2. შეისწავლეთ გვერდის სტრუქტურა. თქვენ უნდა იპოვოთ თქვენთვის საჭირო შინაარსი და ნახოთ რომელ ბლოკში მდებარეობს. თუ ბლოკი, რომელშიც ის მდებარეობს, უნიკალური არ არის, მაშინ იპოვნეთ სხვა საერთო მახასიათებლები, რომლითაც ნამდვილად შეგიძლიათ თქვათ, რომ თუ ხაზი აკმაყოფილებს მათ, მაშინ ეს არის ის, რაც გჭირდებათ.
  3. სტრიქონის ფუნქციების გამოყენებით, ამოიღეთ საჭირო შინაარსი წყაროს სტრიქონიდან იმ მახასიათებლების საფუძველზე, რომლებიც გვხვდება მე-2წერტილი.

აქვე აღვნიშნავ, რომ ამ ყველაფერს მხოლოდ მცოდნე გაიგებს და შეძლებს პრაქტიკაში განხორციელებას PHP. ამიტომ, მათთვის, ვინც ახლახან იწყებს მის შესწავლას, დაგჭირდებათ შემდეგი ცოდნა:

  1. სიმებიანი ფუნქციები.
  2. ბიბლიოთეკა cURL, ან მისი ანალოგი.
  3. შესანიშნავი ცოდნა HTML.

ვინც ჯერ კიდევ არ იცის საერთოდ PHP, მაშინ ამ შემთხვევაში პარსერი ჯერ კიდევ შორს არის და თქვენ უნდა შეისწავლოთ მთელი მონაცემთა ბაზა. ამაში დაგეხმარებათ

თქვენ შეისწავლით თუ როგორ უნდა მიიღოთ საიტზე გამოქვეყნებული ყველა სტატიის სია.

ნაბიჯი 1. მომზადება

პირველ რიგში, თქვენ უნდა დააკოპიროთ ბიბლიოთეკა მარტივი HTMLdom, რომელიც ხელმისაწვდომია ვებგვერდზე

ჩამოტვირთვის არქივი შეიცავს რამდენიმე ფაილს, მაგრამ თქვენ მხოლოდ ერთი გჭირდებათ simple_html_dom.php. ყველა სხვა ფაილი არის მაგალითები და დოკუმენტაცია.

ნაბიჯი 2: საფუძვლების ანალიზი

ამ ბიბლიოთეკის გამოყენება ძალიან მარტივია, მაგრამ არსებობს რამდენიმე ძირითადი რამ, რაც უნდა ისწავლოთ, სანამ მას ამუშავებთ.

$html = new simple_html_dom();
// ჩატვირთვა სტრიქონიდან
$html->ჩატვირთვა("

გამარჯობა მსოფლიო!

");
// Ატვირთე ფაილი
$html->load_file("http://net.tutsplus.com/");

თქვენ შეგიძლიათ შექმნათ საწყისი ობიექტი ჩატვირთვის გზით HTMLან სტრიქონიდან ან ფაილიდან. ფაილიდან ჩატვირთვა შეიძლება განხორციელდეს ან მითითებით URL, ან თქვენი ადგილობრივი ფაილური სისტემიდან.

შენიშვნები: მეთოდი load_file ()დელეგატი მუშაობს PHP ფუნქციაზე file_get_contents. თუ allow_url_fopenარ არის დაყენებული მნიშვნელობაზე მართალიათქვენს ფაილში php.ini, მაშინ შეიძლება ამ გზით ვერ გახსნათ დისტანციური ფაილები. ამ შემთხვევაში, შეგიძლიათ დაუბრუნდეთ CURL ბიბლიოთეკის გამოყენებას დისტანციური გვერდების ჩასატვირთად და შემდეგ წაიკითხოთ მეთოდის გამოყენებით დატვირთვა ().

ინფორმაციაზე წვდომა

მას შემდეგ რაც გექნებათ DOM ობიექტი, შეგიძლიათ დაიწყოთ მასთან მუშაობა ამ მეთოდის გამოყენებით პოვნა ()და კოლექციების შექმნა. კოლექცია არის სელექტორის მიერ ნაპოვნი ობიექტების ჯგუფი. სინტაქსი ძალიან ჰგავს jQuery-ს.



გამარჯობა მსოფლიო!


ჩვენ აქ ვართ.






ამ HTML მაგალითში, ჩვენ ვაპირებთ გაერკვნენ, თუ როგორ მივიღოთ ინფორმაცია მეორე აბზაცში, შევცვალოთ იგი და შემდეგ დავბეჭდოთ მოქმედებების შედეგი.

1. # შექმნა და ჩატვირთე HTML
2. include("simple_html_dom.php");
3. $html = new simple_html_dom();
4. $html->load(“

გამარჯობა მსოფლიო!



“);
5. # მიიღეთ ელემენტი, რომელიც წარმოადგენს მეორე აბზაცს
6. $element = $html->find(“p“);
7. # შეცვალეთ იგი
8. $element->innertext .= “ და ჩვენ აქ ვართ დასარჩენად.“;
9. # გამომავალი!
10. echo $html->save();

ხაზები 2-4: ჩატვირთეთ HTML სტრიქონიდან, როგორც ზემოთ იყო აღწერილი.

ხაზი 6: იპოვეთ ყველა ტეგი

HTML-ში და დააბრუნეთ ისინი მასივში. პირველ აბზაცს ექნება ინდექსი 0, ხოლო მომდევნო აბზაცები შესაბამისად ინდექსირებული იქნება.

ხაზი 8: ჩვენ ვწვდებით მეორე ელემენტს ჩვენს აბზაცების კრებულში (ინდექსი 1), ვამატებთ ტექსტს მის შიდატექსტის ატრიბუტს. შიდატექსტის ატრიბუტი წარმოადგენს ტეგებს შორის არსებულ შინაარსს, ხოლო გარე ტექსტის ატრიბუტი წარმოადგენს შინაარსს ტეგების ჩათვლით. ჩვენ შეგვიძლია შევცვალოთ ტეგი მთლიანად გარე ტექსტის ატრიბუტის გამოყენებით.

ახლა დავამატოთ ერთი ხაზი და შევცვალოთ ჩვენი მეორე აბზაცის ტეგის კლასი.

$element->class = "კლასის_სახელი";
echo $html->save();

საბოლოო HTML შენახვის ბრძანების შემდეგ ასე გამოიყურება:



გამარჯობა მსოფლიო!


ჩვენ აქ ვართ და აქ ვართ, რომ დავრჩეთ.





სხვა სელექტორები

სელექტორების რამდენიმე სხვა მაგალითი. თუ თქვენ იყენებდით jQuery, ყველაფერი ნაცნობი მოგეჩვენებათ.

# მიიღეთ ნაპოვნი პირველი ელემენტი id=“foo“-ით
$single = $html->find("#foo", 0);
# მიიღეთ ყველა ელემენტი კლასით "foo"
$collection = $html->find(".foo");
# მიიღეთ ყველა ბმული ტეგი გვერდზე
$collection = $html->find("a");
# მიიღეთ ყველა ბმული ტეგი, რომელიც მდებარეობს H1 ტეგის შიგნით
$collection = $html->find("h1 a");
# მიიღეთ ყველა img ტეგი title="himom"!}
$collection = $html->find("img");

პირველი მაგალითი მოითხოვს გარკვეულ განმარტებას. ყველა მოთხოვნა ნაგულისხმევად აბრუნებს კოლექციებს, ID-ის მოთხოვნასაც კი, რომელიც უნდა დააბრუნოს მხოლოდ ერთი ელემენტი. თუმცა, მეორე პარამეტრის მითითებით, ჩვენ ვამბობთ "დააბრუნეთ მხოლოდ პირველი ელემენტი კოლექციიდან".

Ეს ნიშნავს, რომ $ მარტოხელა- ერთი ელემენტი და არა ელემენტების მასივი ერთი წევრით.

დანარჩენი მაგალითები საკმაოდ აშკარაა.

დოკუმენტაცია

ბიბლიოთეკის სრული დოკუმენტაცია ხელმისაწვდომია მისამართზე.

ნაბიჯი 3: რეალური სამყაროს მაგალითი

ბიბლიოთეკის მოქმედებაში დემონსტრირებისთვის, ჩვენ დავწერთ სკრიპტს საიტის net.tutsplus.com შიგთავსის ამოსაჭრელად და საიტზე წარმოდგენილი სტატიების სათაურებისა და აღწერილობების ჩამონათვალს... მხოლოდ მაგალითის სახით. Scraping არის ვებ ხრიკი და არ უნდა იქნას გამოყენებული რესურსის მფლობელის ნებართვის გარეშე.

Include("simple_html_dom.php");
$სტატიები = მასივი();
getArticles ("http://net.tutsplus.com/page/76/");

დავიწყოთ ბიბლიოთეკის შეერთებით და ფუნქციის გამოძახებით getArticlesგვერდის მითითებით, საიდანაც გვინდა დავიწყოთ ანალიზი.

ჩვენ ასევე გამოვაცხადებთ გლობალურ მასივს, რათა გაადვილდეს სტატიების შესახებ ყველა ინფორმაციის ერთ ადგილას შეგროვება. სანამ ანალიზს დავიწყებთ, მოდით შევხედოთ როგორ არის აღწერილი სტატია Nettuts+ ვებსაიტზე.



...


სათაური




აღწერა



ეს არის საიტის პოსტის ძირითადი ფორმატი, მათ შორის კომენტარების წყარო კოდზე. რატომ არის კომენტარები მნიშვნელოვანი? ისინი ითვლის პარსერს, როგორც კვანძებს.

ნაბიჯი 4: დაიწყეთ ანალიზის ფუნქცია

ფუნქცია getArticles ($page) (
გლობალური $სტატიები;
$html = new simple_html_dom();
$html->load_file($page);
// ... Უფრო...
}

ჩვენ ვიწყებთ გლობალური მასივის გამოცხადებით, ახალი ობიექტის შექმნით simple_html_dom, და შემდეგ ჩატვირთეთ გვერდი ანალიზისთვის. ამ ფუნქციას გამოიძახებენ რეკურსიულად, ამიტომ მის პარამეტრად ვაყენებთ გვერდის URL-ს.

ნაბიჯი 5. იპოვნეთ საჭირო ინფორმაცია

1. $items = $html->find("div");
2. foreach ($items როგორც $post) (
3. # დაიმახსოვრე კომენტარების დათვლა კვანძებად
4. $articles = მასივი($post->children(3)->გარე ტექსტი,
5. $post->children(6)->first_child()->გარე ტექსტი);
6. }

ეს არის ფუნქციის არსი getArticles. უფრო დეტალურად უნდა შევისწავლოთ, რომ გავიგოთ რა ხდება.

ხაზი 1: შექმენით ელემენტების მასივი - tag დივგადახედვის კლასთან ერთად. ჩვენ ახლა გვაქვს შენახული სტატიების კოლექცია $ ელემენტი.

ხაზი 4: $პოსტიახლა ეხება წინასწარი გადახედვის კლასის ერთ ნაწილს. თუ გადავხედავთ ორიგინალურ HTML-ს, დავინახავთ, რომ მესამე შთამომავალი ელემენტი არის ტეგი H1, რომელიც შეიცავს სტატიის სათაურს. ვიღებთ და ვითვისებთ $ სტატიები.

გახსოვდეთ, რომ დაიწყეთ 0-დან და გაითვალისწინეთ კოდის კომენტარები სწორი კვანძის ინდექსის განსაზღვრისას.

ხაზი 5: მეექვსე შთამომავალი $პოსტი- ეს

. ჩვენ გვჭირდება მისგან აღწერილობის ტექსტი, ამიტომ ვიყენებთ გარე ტექსტი- აბზაცის ტეგი ჩართული იქნება აღწერილობაში. სტატიების მასივში ერთი ჩანაწერი ასე გამოიყურება:

$articles = „სტატიის სათაური“;
$articles = "ეს არის ჩემი სტატიის აღწერა"

ნაბიჯი 6, გვერდებთან მუშაობა

პირველი ნაბიჯი არის იმის განსაზღვრა, თუ როგორ უნდა იპოვოთ შემდეგი გვერდი. Nettuts+-ის საიტზე ძალიან ადვილია გვერდის ნომრის გამოცნობა URL-დან, მაგრამ ჩვენ უნდა მივიღოთ ბმული ანალიზის დროს.

თუ დააკვირდებით HTML-ს, ნახავთ შემდეგს:

»

ეს არის ბმული შემდეგი გვერდისკენ და ჩვენ ადვილად ვიპოვით მას კლასების მიხედვით. nextpostslink’. ახლა ამ ინფორმაციის გამოყენება შესაძლებელია.

If($next = $html->find("a", 0)) (
$URL = $next->href;
$html->clear();
unset($html);
getArticles ($URL);
}

პირველ სტრიქონში ვამოწმებთ, შეგვიძლია თუ არა ვიპოვოთ მითითება კლასთან nextpostslink. გაითვალისწინეთ ფუნქციაში მეორე პარამეტრის გამოყენება პოვნა (). ამ გზით ჩვენ მივუთითებთ, რომ გვინდა მივიღოთ პირველი ელემენტი (ინდექსი 0) დაბრუნებულ კოლექციაში. $ შემდეგიშეიცავს ერთ ელემენტს და არა კოლექციას.

შემდეგ ჩვენ ვანიჭებთ HREF ბმულს $URL ცვლადს. ეს მნიშვნელოვანია, რადგან შემდეგ ჩვენ ვშლით HTML ობიექტს. მეხსიერების გაჟონვის თავიდან ასაცილებლად php5, მიმდინარე ობიექტი simple_html_domუნდა გაიწმინდოს და გაუქმდეს სხვა ობიექტის შექმნამდე. თუ ეს არ გაკეთებულა, მაშინ ყველა ხელმისაწვდომი მეხსიერება შეიძლება მოხმარდეს.

და ბოლოს, ჩვენ მოვუწოდებთ getArticles ფუნქციას შემდეგი გვერდის URL-ით. რეკურსია იშლება, როცა გასარჩევი გვერდები აღარ რჩება.

ნაბიჯი 7. გამოიტანეთ შედეგები

პირველი, ჩვენ ვაპირებთ რამდენიმე ძირითადი სტილის დაყენებას. ყველაფერი სრულიად თვითნებურია - შეგიძლიათ დააინსტალიროთ ის, რაც მოგწონთ.

#მთავარი (
ზღვარი: 80 პიქსელი ავტო;
სიგანე: 500px;
}
h1 (
შრიფტი: თამამი 40px/38px helvetica, verdana, sans-serif;
ზღვარი: 0;
}
სთ 1 ა (
ფერი:#600;
ტექსტი-დეკორაცია:არცერთი;
}
p(
ფონი: #ECECEC;
შრიფტი:10px/14px verdana, sans-serif;
ზღვარი:8px 0 15px;
საზღვარი: 1px #CCC მყარი;
padding: 15px;
}
.პუნქტი(
padding: 10px;
}

შემდეგ ჩვენ ვწერთ პატარა PHP ფუნქციას გვერდზე ადრე შენახული ინფორმაციის საჩვენებლად.

foreach ($articles როგორც $item) (
ექო"

";
echo $item;
echo $item;
ექო"
";
}
?>

საბოლოო შედეგი არის ერთი HTML გვერდი, რომელშიც ჩამოთვლილია ყველა სტატია Nettuts+ გვერდებიდან, დაწყებული პირველ ზარში მითითებული სტატიით. getArticles ().

ნაბიჯი 8. დასკვნა

თუ დაიწყებთ გვერდების დიდი რაოდენობის (ვთქვათ, მთელი საიტის) სკრაპს, მაშინ ამას შეიძლება დიდი დრო დასჭირდეს. ისეთ საიტზე, როგორიცაა Nettuts+, რომელსაც აქვს 86-ზე მეტი გვერდი, ანალიზის პროცესს შეიძლება წუთზე მეტი დასჭირდეს.

ეს გაკვეთილი გაგაცნობთ HTML პარსინგის თემას. არსებობს სხვა DOM მანიპულირების ტექნიკა, რომელიც საშუალებას გაძლევთ იმუშაოთ xpath სელექტორთან ელემენტების მოსაძებნად. ამ სახელმძღვანელოში აღწერილი ბიბლიოთეკა მარტივი გამოსაყენებელია და შესანიშნავია სწრაფად დასაწყებად. დაიმახსოვრეთ, რომ მოითხოვეთ ნებართვა საიტის გახეხვამდე.





გაქვთ შეკითხვები?

შეატყობინეთ შეცდომას

ტექსტი, რომელიც გაეგზავნება ჩვენს რედაქტორებს: