เรากำลังเขียนตัวแยกวิเคราะห์เนื้อหาใน PHP การแยกวิเคราะห์และประมวลผลหน้าเว็บใน PHP: การเลือกไลบรารี่ที่ดีที่สุด วิธีแยกวิเคราะห์หน้า html

หน้าแยกวิเคราะห์เนื้อหา PHP

บทความนี้มีเนื้อหาเกี่ยวกับการแยกวิเคราะห์ โดยเฉพาะการแยกวิเคราะห์เว็บไซต์ การแยกวิเคราะห์หน้า การแยกวิเคราะห์เว็บ การแยกวิเคราะห์เนื้อหา html ของเว็บไซต์

ในกระบวนการพัฒนาบริการเว็บต่าง ๆ เรามักเผชิญกับงานที่ต้องรับข้อมูลประเภทต่าง ๆ ในปริมาณมากอย่างรวดเร็ว เรื่องนี้เกี่ยวข้องกับการขโมยข้อมูล การโจรกรรมข้อมูล หรือสิ่งที่คุณต้องการเรียกเป็นหลัก ประเด็นก็คือข้อมูลสามารถเข้าถึงได้และเปิดกว้าง ลักษณะเฉพาะของการแยกวิเคราะห์คือการรวบรวมข้อมูลและเนื้อหาจากหน้าเว็บไซต์อย่างรวดเร็วและเป็นอัตโนมัติ

ปัจจุบันการขูดในสภาพแวดล้อมของเว็บเป็นที่นิยมอย่างมาก กล่าวคือ การขูดไซต์ที่มีคุณค่าและความเกี่ยวข้องสำหรับผู้คนเป็นอย่างน้อย คุณค่าเฉพาะคือแคตตาล็อกผลิตภัณฑ์ รวมถึงรูปภาพ ฐานข้อมูลไดเร็กทอรี และอื่นๆ อีกมากมายที่อาจเป็นประโยชน์สำหรับคู่แข่ง

ลองแยกวิเคราะห์ข้อมูลที่จำเป็นใน html ลองรับลิงก์ทั้งหมดจากหลายหน้าในเว็บไซต์ของเรา

ขั้นแรก เราต้องได้รับเนื้อหาเว็บไซต์ในรูปแบบ html ในการดำเนินการนี้ เราเพียงแค่ต้องทราบที่อยู่ของหน้าที่จำเป็น

ฉันต้องการแสดง 2 วิธีหลักในการรับเนื้อหาจากหน้าเว็บไซต์:

ก่อนอื่น มาเตรียมอาร์เรย์พร้อมที่อยู่หน้าที่จำเป็น:

//3 ลิงก์ไปยังเว็บไซต์ของเรา: $urls = array("http://hello-site..ru/games/");

ตัวเลือก 1 - ฟังก์ชัน php file_get_contents- ฟังก์ชั่นส่งคืนสตริง html ที่เราจะแยกวิเคราะห์เป็นลิงก์:

//ใส่แต่ละลิงค์ลงในฟังก์ชัน file_get_contents foreach($urls as $urlsItem)( $out .= file_get_contents($urlsItem); //และเพิ่มเนื้อหาของแต่ละหน้าในบรรทัด ) echo $out; //นี่คือเนื้อหาทั้งสามหน้า

ตัวเลือก 2 - CURL- ไลบรารี่ที่ php รองรับและมีชุดการตั้งค่าจำนวนมาก ตั้งแต่คำขอ POST ไปจนถึงการทำงานกับ FTP ลองพิจารณาการเรียกไลบรารี curl แบบมาตรฐาน ซึ่งจะให้เนื้อหาไซต์แก่เรา:

foreach($urls as $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); //นี่คือเนื้อหาทั้งสามหน้า

ตอนนี้บรรทัด $out ของเรามีเนื้อหาทั้งสามหน้า ดังนั้น เรามาแยกวิเคราะห์สตริงของเรากันดีกว่า

ฉันต้องการแสดง 3 ตัวเลือกในการแก้ปัญหาของเราอีกครั้ง: วิธี "ดั้งเดิม" ใน PHP โดยใช้ไลบรารี DOMDocument ในตัวและไลบรารี SimpleHTMLDOM

1. ฟังก์ชั่น php ระเบิด- ฟังก์ชันค้นหาอักขระที่ค้นหาหรือส่วนของสตริงและแบ่งสตริงทั้งหมดออกเป็นองค์ประกอบอาร์เรย์

ฉันขอย้ำอีกครั้งว่าเราต้องได้รับค่าของแอตทริบิวต์ href ทั้งหมดของแท็ก เพื่อสิ่งนี้ เราจะแบ่งสตริงทั่วไปออกเป็นบางส่วน\เซ็กเมนต์:

// ระเบิด $hrefs = ระเบิด("

หากเราพิมพ์อาร์เรย์ของเราออกมา มันจะมีลักษณะดังนี้:

อาร์เรย์ ( => / => /hello => /timer/ => /leftmenu/ => /faq/ => /blog/ => /web-notes/ => /ordersite/ => /games)

2. ไลบรารี DOMDocument ในตัว- เราทำงานกับชั้นเรียนประมาณดังนี้:

//domelement $dom = DOMDocument ใหม่; //สร้างวัตถุ $dom->loadHTML($out); //โหลดเนื้อหา $node = $dom->getElementsByTagName("a"); //นำแท็กทั้งหมด a for ($i = 0; $i< $node->ความยาว; $i++) ( $hrefText = $node->item($i)->getAttribute("href"); //รับแอตทริบิวต์ href จากแท็ก) foreach($hrefText as $hrefTextItem)( //กำจัดลิงก์ ด้วยแอตทริบิวต์ว่าง href if($hrefTextItem!="")( $clearHrefs=$hrefTextItem; ) ) $clearHrefs = array_unique($clearHrefs); //กำจัดลิงค์ที่เหมือนกัน print_r($clearHrefs); // ในที่สุดเราก็มีอาร์เรย์พร้อมลิงก์ทั้งหมดจาก 3 หน้า

ผลลัพธ์ของโค้ดนี้เหมือนกับการใช้ฟังก์ชันระเบิดทุกประการ

3. ไลบรารี SimpleHTMLDOM- จะต้องรวมจากไฟล์ งานมีความคล้ายคลึงกับ DOMDocument โดยประมาณ การทำงานกับชั้นเรียน:

//simplehtml รวม("simple_html_dom.php"); //รวมไฟล์ที่มีคลาส SimpleHTMLDOM $html = new simple_html_dom(); //สร้างวัตถุ $html->load($out); //วางเนื้อหาของเรา $collection = $html->find("a"); //รวบรวมแท็กทั้งหมด a foreach($collection as $collectionItem) ( $articles = $collectionItem->attr; //array ของแอตทริบิวต์ทั้งหมด, href รวมถึง ) foreach($articles as $articlesItem)( $hrefText = $articlesItem[ " href"]; //รวบรวมค่าของอาร์เรย์ย่อยด้วยคีย์ href ลงในอาร์เรย์) foreach($hrefText as $hrefTextItem)( //กำจัดลิงก์ที่มีแอตทริบิวต์ href ว่างเปล่า if($hrefTextItem!="" )( $clearHrefs=$hrefTextItem; ) ) $clearHrefs = array_unique($clearHrefs); //กำจัดลิงค์ที่เหมือนกัน print_r($clearHrefs); // ในที่สุดเราก็มีอาร์เรย์พร้อมลิงก์ทั้งหมดจาก 3 หน้า

ฉันขอย้ำอีกครั้งว่าผลลัพธ์ในอาร์เรย์จะเหมือนกับในสองข้อด้านบนทุกประการ

ขณะนี้เมื่อมีอาร์เรย์พร้อมลิงก์ทั้งหมดที่รวบรวมจากสามหน้าของไซต์ คุณสามารถส่งลิงก์ไปในทิศทางที่ถูกต้องได้ ทุกอย่างขึ้นอยู่กับงานและจินตนาการ ด้วยความสามารถดังกล่าว คุณสามารถแยกวิเคราะห์ข้อมูล รูปภาพ ข้อความ บันทึก ฯลฯ จำนวนมากได้ ข้อมูลของคนอื่นอยู่ในมือของคุณ กำจัดทิ้งตามที่คุณต้องการ แต่ปกป้องตัวเอง แม้ว่าจะเป็นไปไม่ได้ก็ตาม)

งานแยกวิเคราะห์และประมวลผลข้อมูลที่จำเป็นจากไซต์บุคคลที่สามมักเผชิญหน้ากับนักพัฒนาเว็บบ่อยครั้งและด้วยเหตุผลหลายประการ: ด้วยวิธีนี้คุณสามารถเติมเนื้อหาให้กับโปรเจ็กต์ของคุณ โหลดข้อมูลบางอย่างแบบไดนามิก และอื่น ๆ

ในกรณีเช่นนี้โปรแกรมเมอร์ต้องเผชิญกับคำถาม: มีห้องสมุดให้เลือกหลายสิบแห่ง? ในบทความนี้ เราพยายามพิจารณาตัวเลือกยอดนิยมและเลือกตัวเลือกที่ดีที่สุด

นิพจน์ทั่วไป

แม้ว่า "งานประจำ" จะเป็นสิ่งแรกที่ต้องคำนึงถึง แต่คุณไม่ควรใช้สำหรับโครงการจริง

ใช่ นิพจน์ทั่วไปทำงานได้ดีที่สุดกับงานง่ายๆ แต่การใช้งานจะยากขึ้นมากเมื่อคุณต้องการแยกวิเคราะห์โค้ด HTML ที่มีขนาดใหญ่และซับซ้อน ซึ่งยิ่งกว่านั้น มันไม่ตรงกับรูปแบบเฉพาะใดๆ เสมอไป และโดยทั่วไปอาจมีข้อผิดพลาดทางไวยากรณ์ .

แทนที่จะ "ทำให้" นิพจน์ทั่วไปของคุณเสร็จสิ้นโดยมีการเปลี่ยนแปลงโค้ดเพียงเล็กน้อย เราขอแนะนำให้ใช้เครื่องมือด้านล่างนี้ ซึ่งง่ายกว่า สะดวกกว่า และเชื่อถือได้มากกว่า

XPath และ DOM

htmlSQL

หากคุณไม่ได้ใช้ PHP คุณสามารถดูรายการเครื่องมือที่คล้ายกันสำหรับภาษาโปรแกรมอื่นๆ ได้

ล่าสุดฉันได้ทำงานในบริษัท LLC "วิทยุเมืองซาคาลิน"ในทีมนักพัฒนาและนักข่าวพอร์ทัลข้อมูลและความบันเทิง “Sitisakh” โดยเฉพาะอย่างยิ่งสำหรับแฟนฟุตบอล พอร์ทัลสนับสนุนส่วน "กีฬา" พร้อมข่าวสารจากโลกฟุตบอล อันดับ และรายชื่อผู้เล่นของทีม FC Sakhalin

ขณะนี้พอร์ทัลอยู่ระหว่างการออกแบบใหม่ ดังนั้นฉันจึงได้รับมอบหมายให้ดูแลส่วน "กีฬา" หน้าที่หลักของฉันในทีมคือการวางเลย์เอาต์การออกแบบใหม่ บางครั้งเราต้องแก้ไขปัญหาด้านข้างเพื่ออำนวยความสะดวกในการทำงานที่ยากลำบากของโปรแกรมเมอร์หลักของเรา วันนี้ฉันจะพูดเกี่ยวกับ Microparser

ก่อนหน้านี้ ผู้จัดการเนื้อหากรอกตารางการแข่งขันฟุตบอลบนพอร์ทัลด้วยตนเอง มีหลายกรณีที่ผลการแข่งขันปรากฏบน Championship.com เร็วกว่าบนพอร์ทัลของเรา ในที่สุดเราก็ได้ตัดสินใจที่จะทำให้ตารางอัปเดตโดยอัตโนมัติ เนื่องจาก Championship.com ไม่มี API (อย่างน้อยก็มี API แบบเปิด) สำหรับรับตารางทัวร์นาเมนต์ที่แสดงอยู่ ทางเลือกเดียวก็คือการแยกวิเคราะห์

วิธีใช้ไมโครพาร์เซอร์

“microparser” ประกอบด้วยฟังก์ชันเดียว - parse_site(array $sites, array $defaults = array()) อาร์กิวเมนต์แรกคืออาร์เรย์ของไซต์ (หรือหน้าในไซต์เดียว) ที่ต้องแยกวิเคราะห์ และอาร์กิวเมนต์ที่สองคืออาร์เรย์ของการตั้งค่าเริ่มต้น

อาร์เรย์ $sites มีรูปแบบดังต่อไปนี้:

Array("zona_vostok" => array("url" => "http://www.championat.com/football/_russia2d/589/table/all.html", "xpath" => "some/x/path" , //เป็นทางเลือก "xsl" => "absolute/path/to/xsl", //ทางเลือก), "stackoverflow" => array("url" => "http://stackoverflow.com", "xpath" = > "some/x/path", "transform" => false //เป็นทางเลือก));

คีย์ทั้งหมดยกเว้น url เป็นทางเลือก หากไม่มีนิพจน์ XPath หน้าเว็บที่ระบุในค่าคีย์ url จะได้รับการประมวลผลทั้งหมด นอกจากนี้ยังสามารถรวมสไตล์ชีต XSL ได้เฉพาะในกรณีที่จำเป็นต้องมีการประมวลผลโค้ดดิบเท่านั้น

ให้ความสนใจกับคีย์ "transform" => false มันถูกใช้เมื่ออาร์เรย์ $defaults มีสไตล์ชีต XSL เริ่มต้น แต่ไม่จำเป็นต้องแปลงสำหรับเพจที่กำหนด

อาร์เรย์ $defaults หลีกเลี่ยงการคัดลอกการตั้งค่าลงในอาร์เรย์ $sites สามารถมีได้เพียงสองคีย์: xpath และ xsl ปุ่มอื่นๆ จะถูกละเว้น

สรุป

ตัวแยกวิเคราะห์ที่ฉันเขียนประกอบด้วยหนึ่งฟังก์ชันที่มีสองพารามิเตอร์ (สำหรับการตั้งค่าส่วนตัวและทั่วไป) ช่วยให้คุณสามารถโหลดทั้งหน้าหรือแยกส่วนย่อยของหน้านั้นได้และหากต้องการให้ประมวลผลผลลัพธ์ด้วยสไตล์ชีต XSL

ในตอนแรก ฉันต้องการใช้ไลบรารีเช่น phpQuery หรือ Ganon เพื่อสำรวจโหนด แต่จากนั้นฉันก็คิดอย่างรอบคอบและตระหนักว่าไม่มีประโยชน์ที่จะลากการขึ้นต่อกันเพิ่มเติม คุณสามารถใช้เครื่องมือที่มีอยู่แล้วภายในได้

ตัวอย่างการทำงาน

มาดูอันดับฟุตบอลชิงแชมป์รัสเซีย ดิวิชั่น 2 โซน "ตะวันออก" กัน

เนื่องจากเราจำเป็นต้อง "ดึง" ตารางการแข่งขันโดยตรงจากหน้า นิพจน์ XPath จะเป็นดังนี้: //div[@id="section-statistics"]/table

ตารางต้นฉบับมีขยะจำนวนมาก: คุณลักษณะ คลาส สไตล์อินไลน์ ดังนั้น เราจะทำให้มันดูดีขึ้นโดยใช้สไตล์ชีต XSL ที่มีเนื้อหาดังต่อไปนี้:

ทีม เกม ชัยชนะ วาด การสูญเสีย ลูกบอล แว่นตา
สม่ำเสมอ แปลก

ตอนนี้เรามาเขียนโค้ดเพื่อแสดงตารางการแข่งขันที่เสร็จสิ้นแล้ว

$results = parse_site(array("zona_vostok" => array("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 Luch-พลังงาน 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. ดาวน์โหลดไฟล์เก็บถาวร:

หลายท่านมีคำถามเกี่ยวกับ การสร้าง parser ใน PHP- ตัวอย่างเช่น มีเว็บไซต์และคุณต้องได้รับเนื้อหาจากเว็บไซต์นั้น ฉันไม่อยากเขียนบทความนี้เป็นเวลานานเพราะไม่มีความหมายเฉพาะในนั้น ถึง สร้าง parser ใน PHPคุณต้องรู้ภาษานี้ และคนที่รู้จักเขาก็จะไม่ถามคำถามเช่นนี้ แต่ในบทความนี้ฉันจะบอกคุณว่าโดยทั่วไปแล้ว parsers ถูกสร้างขึ้นอย่างไรรวมถึงสิ่งที่ต้องศึกษาเป็นพิเศษ

ต่อไปนี้เป็นรายการประเด็นที่คุณต้องผ่านเพื่อที่จะบรรลุผล สร้างตัวแยกวิเคราะห์เนื้อหาใน PHP:

  1. รับเนื้อหาของหน้าและเขียนลงในตัวแปรสตริง ตัวเลือกที่ง่ายที่สุดคือฟังก์ชัน file_get_contents()- หากเนื้อหามีให้เฉพาะผู้ใช้ที่ได้รับอนุญาตเท่านั้น ทุกอย่างจะค่อนข้างซับซ้อนกว่านี้ ที่นี่เราต้องดูว่ากลไกการอนุญาตคืออะไร ต่อไปก็ใช้. ม้วนผมส่งคำขอที่ถูกต้องไปยังแบบฟอร์มการอนุญาต รับการตอบกลับ จากนั้นส่งส่วนหัวที่ถูกต้อง (เช่น ตัวระบุเซสชันที่ได้รับ) และในคำขอเดียวกันให้เข้าถึงเพจที่จำเป็น จากนั้นในคำตอบนี้ คุณจะได้รับหน้าสุดท้าย
  2. ศึกษาโครงสร้างหน้า คุณต้องค้นหาเนื้อหาที่คุณต้องการและดูว่าเนื้อหานั้นอยู่ที่ใด หากบล็อกที่ตั้งอยู่นั้นไม่ซ้ำกันให้ค้นหาลักษณะทั่วไปอื่น ๆ ที่คุณสามารถพูดได้อย่างแน่นอนว่าหากบรรทัดนั้นตรงใจพวกเขานี่คือสิ่งที่คุณต้องการ
  3. ใช้ฟังก์ชันสตริง แยกเนื้อหาที่คุณต้องการจากสตริงต้นทางตามลักษณะที่พบใน 2จุด.

ข้าพเจ้าจะสังเกตด้วยว่าเฉพาะผู้รู้เท่านั้นที่จะเข้าใจทั้งหมดนี้และสามารถนำไปปฏิบัติได้ PHP- ดังนั้นสำหรับผู้ที่เพิ่งเริ่มศึกษาคุณจะต้องมีความรู้ดังต่อไปนี้:

  1. ฟังก์ชันสตริง
  2. ห้องสมุด ม้วนผมหรืออะนาล็อกของมัน
  3. ความรู้ที่ยอดเยี่ยม HTML.

พวกที่ยังไม่รู้เลย PHPดังนั้นตัวแยกวิเคราะห์ในกรณีนี้ยังอยู่ห่างไกลและคุณต้องศึกษาฐานข้อมูลทั้งหมด มันจะช่วยคุณในเรื่องนี้

คุณจะได้เรียนรู้วิธีรับรายการบทความทั้งหมดที่เผยแพร่บนเว็บไซต์

ขั้นตอนที่ 1 การเตรียมการ

ก่อนอื่นคุณต้องคัดลอกไลบรารี ง่ายHTMLdomซึ่งมีอยู่บนเว็บไซต์

ไฟล์เก็บถาวรการดาวน์โหลดมีหลายไฟล์ แต่คุณต้องการเพียงไฟล์เดียวเท่านั้น simple_html_dom.php- ไฟล์อื่นๆ ทั้งหมดเป็นตัวอย่างและเอกสารประกอบ

ขั้นตอนที่ 2 พื้นฐานการแยกวิเคราะห์

ไลบรารีนี้ใช้งานง่ายมาก แต่มีสิ่งพื้นฐานบางประการที่ต้องเรียนรู้ก่อนที่จะนำไปใช้งาน

$html = ใหม่ simple_html_dom();
// โหลดจากสตริง
$html->โหลด("

สวัสดีชาวโลก!

");
//อัพโหลดไฟล์
$html->load_file("http://net.tutsplus.com/");

คุณสามารถสร้างออบเจ็กต์ต้นทางได้โดยการโหลด HTMLจากสตริงหรือจากไฟล์ การโหลดจากไฟล์สามารถทำได้โดยการระบุ URLหรือจากระบบไฟล์ในเครื่องของคุณ

หมายเหตุ: วิธีการ โหลด_ไฟล์()ผู้รับมอบสิทธิ์ทำงานกับฟังก์ชัน PHP file_get_contents- ถ้า Allow_url_fopenไม่ได้กำหนดเป็นค่า จริงในไฟล์ของคุณ php.iniจากนั้นคุณอาจไม่สามารถเปิดไฟล์ระยะไกลด้วยวิธีนี้ได้ ในกรณีนี้ คุณสามารถเปลี่ยนกลับไปใช้ไลบรารี CURL เพื่อโหลดเพจระยะไกล จากนั้นอ่านโดยใช้วิธีการได้ โหลด().

การเข้าถึงข้อมูล

เมื่อคุณมีวัตถุ DOM แล้ว คุณสามารถเริ่มทำงานกับวัตถุนั้นได้โดยใช้วิธีการ หา()และการสร้างคอลเลกชัน คอลเลกชันคือกลุ่มของวัตถุที่พบโดยตัวเลือก ไวยากรณ์คล้ายกับ jQuery มาก



สวัสดีชาวโลก!


อยู่ที่นี่.






ในตัวอย่าง HTML นี้ เราจะมาดูวิธีเข้าถึงข้อมูลในย่อหน้าที่สอง เปลี่ยนแปลงข้อมูล จากนั้นจึงพิมพ์ผลลัพธ์ของการดำเนินการ

1. # สร้างและโหลด HTML
2. รวม("simple_html_dom.php");
3. $html = ใหม่ simple_html_dom();
4. $html->โหลด(“

สวัสดีชาวโลก!



“);
5. # รับองค์ประกอบที่แสดงถึงย่อหน้าที่สอง
6. $element = $html->find(“p“);
7.#แก้ไขมัน
8. $element->innertext .= “ และเราอยู่ที่นี่ต่อไป”;
9. # เอาล่ะ!
10. echo $html->save();

บรรทัดที่ 2-4: โหลด HTML จากสตริงตามที่อธิบายไว้ข้างต้น

บรรทัดที่ 6: ค้นหาแท็กทั้งหมด

ใน HTML และส่งคืนไปยังอาร์เรย์ ย่อหน้าแรกจะมีดัชนี 0 และย่อหน้าถัดไปจะถูกจัดทำดัชนีตามนั้น

บรรทัดที่ 8: เราเข้าถึงองค์ประกอบที่สองในคอลเลกชันย่อหน้าของเรา (ดัชนี 1) โดยเพิ่มข้อความลงในแอตทริบิวต์ข้อความภายใน คุณลักษณะข้อความภายในแสดงถึงเนื้อหาระหว่างแท็ก และแอตทริบิวต์ข้อความภายนอกแสดงถึงเนื้อหารวมทั้งแท็ก เราสามารถแทนที่แท็กได้อย่างสมบูรณ์โดยใช้แอตทริบิวต์ข้อความนอก

ตอนนี้เรามาเพิ่มหนึ่งบรรทัดและแก้ไขคลาสแท็กของย่อหน้าที่สองของเรา

$องค์ประกอบ->คลาส = "class_name";
เสียงสะท้อน $html->บันทึก();

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="himo"!}
$collection = $html->find("img");

ตัวอย่างแรกต้องมีคำอธิบายบางอย่าง การสืบค้นทั้งหมดส่งคืนคอลเล็กชันตามค่าเริ่มต้น แม้แต่การสืบค้น ID ซึ่งควรส่งคืนองค์ประกอบเดียวเท่านั้น อย่างไรก็ตาม โดยการระบุพารามิเตอร์ที่สอง เรากำลังพูดว่า "ส่งคืนเฉพาะองค์ประกอบแรกจากคอลเลกชัน"

มันหมายความว่าอย่างนั้น $เดียว- องค์ประกอบเดียว ไม่ใช่อาร์เรย์ขององค์ประกอบที่มีสมาชิกเพียงตัวเดียว

ตัวอย่างที่เหลือค่อนข้างชัดเจน

เอกสารประกอบ

เอกสารฉบับสมบูรณ์สำหรับห้องสมุดมีอยู่ที่

ขั้นตอนที่ 3: ตัวอย่างโลกแห่งความเป็นจริง

เพื่อสาธิตการทำงานของห้องสมุด เราจะเขียนสคริปต์เพื่อคัดลอกเนื้อหาของเว็บไซต์ net.tutsplus.com และสร้างรายชื่อชื่อเรื่องและคำอธิบายของบทความที่นำเสนอบนเว็บไซต์....เพียงเป็นตัวอย่าง การขูดเป็นเคล็ดลับบนเว็บและไม่ควรใช้โดยไม่ได้รับอนุญาตจากเจ้าของทรัพยากร

รวม("simple_html_dom.php");
$articles = array();
getArticles("http://net.tutsplus.com/page/76/");

เริ่มต้นด้วยการเชื่อมต่อไลบรารีและเรียกใช้ฟังก์ชัน รับบทความระบุหน้าที่เราต้องการเริ่มแยกวิเคราะห์

นอกจากนี้เรายังจะประกาศอาร์เรย์ส่วนกลางเพื่อให้ง่ายต่อการรวบรวมข้อมูลทั้งหมดเกี่ยวกับบทความในที่เดียว ก่อนที่เราจะเริ่มแยกวิเคราะห์ เรามาดูกันว่าบทความบนเว็บไซต์ Nettuts+ มีการอธิบายไว้อย่างไร



...


ชื่อ




คำอธิบาย



นี่คือรูปแบบพื้นฐานของการโพสต์บนเว็บไซต์ รวมถึงความคิดเห็นเกี่ยวกับซอร์สโค้ด เหตุใดความคิดเห็นจึงมีความสำคัญ parser จะถูกนับว่าเป็นโหนด

ขั้นตอนที่ 4: การเริ่มต้นฟังก์ชันการแยกวิเคราะห์

ฟังก์ชั่น getArticles($ หน้า) (
บทความ $ ทั่วโลก;
$html = ใหม่ simple_html_dom();
$html->load_file($หน้า);
// ... ไกลออกไป...
}

เราเริ่มต้นด้วยการประกาศอาเรย์ส่วนกลางโดยสร้างอ็อบเจ็กต์ใหม่ simple_html_domจากนั้นโหลดหน้าเพื่อแยกวิเคราะห์ ฟังก์ชันนี้จะถูกเรียกซ้ำ ดังนั้นเราจึงตั้งค่า URL ของหน้าเป็นพารามิเตอร์สำหรับมัน

ขั้นตอนที่ 5 ค้นหาข้อมูลที่เราต้องการ

1. $items = $html->find("div");
2. foreach($รายการเป็น $post) (
3. #อย่าลืมนับความคิดเห็นเป็นโหนด
4. $articles = array($post->children(3)->outertext,
5. $post->children(6)->first_child()->ข้อความด้านนอก);
6. }

นี่คือสาระสำคัญของฟังก์ชัน รับบทความ- เราต้องพิจารณาให้ละเอียดมากขึ้นเพื่อทำความเข้าใจว่าเกิดอะไรขึ้น

บรรทัดที่ 1: สร้างอาร์เรย์ขององค์ประกอบ - แท็ก กองกับคลาสพรีวิว ขณะนี้เราได้รวบรวมบทความที่บันทึกไว้แล้ว $รายการ.

บรรทัดที่ 4: $โพสต์ตอนนี้อ้างถึง div เดียวของคลาสแสดงตัวอย่าง ถ้าเราดูที่ HTML ดั้งเดิม เราจะเห็นว่าองค์ประกอบลูกที่สามคือแท็ก H1ซึ่งมีชื่อเรื่องของบทความ เรารับมันและเหมาะสม $บทความ.

อย่าลืมเริ่มต้นที่ 0 และคำนึงถึงความคิดเห็นของซอร์สโค้ดเมื่อพิจารณาดัชนีโหนดที่ถูกต้อง

บรรทัดที่ 5: ทายาทคนที่หก $โพสต์- นี้

- เราต้องการข้อความคำอธิบายจากนั้นจึงใช้ ข้อความด้านนอก- แท็กย่อหน้าจะรวมอยู่ในคำอธิบาย รายการเดียวในอาร์เรย์ Articles จะมีลักษณะดังนี้:

$articles = “ชื่อบทความ”;
$articles = “นี่คือคำอธิบายบทความของฉัน”

ขั้นตอนที่ 6 การทำงานกับเพจ

ขั้นตอนแรกคือการกำหนดวิธีค้นหาหน้าถัดไป บนไซต์ Nettuts+ มันง่ายมากที่จะเดาหมายเลขหน้าจาก URL แต่เราจำเป็นต้องได้รับลิงก์ในการแยกวิเคราะห์

หากคุณดูที่ HTML คุณจะพบสิ่งต่อไปนี้:

»

นี่คือลิงค์ไปยังหน้าถัดไปและเราสามารถค้นหาได้โดยง่ายตามชั้นเรียน ' โพสต์ถัดไปลิงก์- ตอนนี้ข้อมูลนี้สามารถใช้งานได้แล้ว

ถ้า($next = $html->find("a", 0)) (
$URL = $ถัดไป->href;
$html->ชัดเจน();
ไม่ได้ตั้งค่า($html);
getArticles($URL);
}

ในบรรทัดแรก เราจะตรวจสอบว่าสามารถพบการอ้างอิงกับคลาสหรือไม่ โพสต์ถัดไปลิงก์- สังเกตการใช้พารามิเตอร์ตัวที่สองในฟังก์ชัน หา()- ด้วยวิธีนี้เราระบุว่าเราต้องการรับองค์ประกอบแรก (ดัชนี 0) ในคอลเลกชันที่ส่งคืน $ ถัดไปมีองค์ประกอบเดียว ไม่ใช่คอลเลกชัน

จากนั้นเราจะกำหนดลิงก์ HREF ให้กับตัวแปร $URL นี่เป็นสิ่งสำคัญเพราะต่อไปเราจะลบออบเจ็กต์ HTML เพื่อป้องกันหน่วยความจำรั่วใน php5 ซึ่งเป็นวัตถุปัจจุบัน simple_html_domต้องล้างและยกเลิกการตั้งค่าก่อนจึงจะสามารถสร้างออบเจ็กต์อื่นได้ หากไม่เสร็จสิ้น หน่วยความจำที่มีอยู่ทั้งหมดอาจถูกใช้ไป

สุดท้ายนี้ เราเรียกฟังก์ชัน getArticles ด้วย URL ของหน้าถัดไป การเรียกซ้ำจะหยุดทำงานเมื่อไม่มีหน้าเหลือให้แยกวิเคราะห์

ขั้นตอนที่ 7 ส่งออกผลลัพธ์

ขั้นแรก เราจะติดตั้งสไตล์พื้นฐานบางอย่าง ทุกอย่างเป็นไปตามอำเภอใจโดยสมบูรณ์ - คุณสามารถติดตั้งสิ่งที่คุณต้องการได้

#หลัก (
ระยะขอบ:80px อัตโนมัติ;
ความกว้าง:500px;
}
h1 (
แบบอักษร: ตัวหนา 40px/38px เฮลเวติกา, verdana, sans-serif;
ระยะขอบ:0;
}
h1 ก (
สี:#600;
การตกแต่งข้อความ: ไม่มี;
}
พี(
พื้นหลัง: #ECECEC;
แบบอักษร:10px/14px verdana, sans-serif;
ระยะขอบ:8px 0 15px;
เส้นขอบ: 1px #CCC ทึบ;
ช่องว่างภายใน: 15px;
}
.รายการ(
ช่องว่างภายใน:10px;
}

จากนั้นเราจะเขียนฟังก์ชัน PHP เล็กๆ บนเพจเพื่อแสดงข้อมูลที่บันทึกไว้ก่อนหน้านี้

foreach($บทความเป็น $item) (
เสียงสะท้อน "

";
สะท้อน $ รายการ;
สะท้อน $ รายการ;
เสียงสะท้อน "
";
}
?>

ผลลัพธ์สุดท้ายคือหน้า HTML เดียวที่แสดงรายการบทความทั้งหมดจากหน้า Nettuts+ โดยเริ่มจากบทความที่ระบุไว้ในการเรียกครั้งแรก รับบทความ().

ขั้นตอนที่ 8 บทสรุป

หากคุณเริ่มดึงข้อมูลเป็นจำนวนหลายหน้า (เช่น ทั้งไซต์) การดำเนินการนี้อาจใช้เวลานาน บนไซต์เช่น Nettuts+ ซึ่งมีมากกว่า 86 หน้า กระบวนการแยกวิเคราะห์อาจใช้เวลานานกว่าหนึ่งนาที

บทเรียนนี้จะแนะนำให้คุณรู้จักกับหัวข้อการแยกวิเคราะห์ HTML มีเทคนิคการจัดการ DOM อื่นๆ ที่ช่วยให้คุณสามารถทำงานกับตัวเลือก xpath เพื่อค้นหาองค์ประกอบได้ ไลบรารีที่อธิบายไว้ในบทช่วยสอนนี้ใช้งานง่ายและเหมาะสำหรับการเริ่มต้นใช้งานอย่างรวดเร็ว อย่าลืมขออนุญาตก่อนที่จะคัดลอกไซต์





มีคำถามหรือไม่?

แจ้งการพิมพ์ผิด

ข้อความที่จะส่งถึงบรรณาธิการของเรา: