Web Scraping เป็นเทคนิคที่ใช้ในการดึงข้อมูลจากเว็บไซต์ ช่วยให้กระบวนการดึงข้อมูลจากเว็บไซต์และไฟล์ HTML เป็นไปโดยอัตโนมัติ ในฐานะนักพัฒนา C# เราสามารถตรวจสอบ จับภาพ และแยกข้อมูล เช่น รูปภาพ วิดีโอ เสียง ฯลฯ จากหน้าเว็บได้อย่างง่ายดาย ในบทความนี้ เราจะได้เรียนรู้วิธีทำการขูดเว็บด้วยการแยกวิเคราะห์ HTML โดยใช้ C#
หัวข้อต่อไปนี้จะครอบคลุมในบทความนี้:
- API การขูดเว็บ C#
- อ่านและแยก HTML โดยใช้ C#
- ตรวจสอบองค์ประกอบเอกสารโดยใช้ C#
- ค้นหาองค์ประกอบเฉพาะโดยใช้ตัวกรองใน C#
- สืบค้นข้อมูลจาก HTML โดยใช้ C#
- แยกโดยใช้ตัวเลือก CSS ใน C#
API การขูดเว็บ C#
สำหรับการคัดลอกเว็บจากไฟล์ HTML หรือ URL เราจะใช้ Aspose.HTML for .NET API เป็น API การประมวลผล HTML ขั้นสูงที่ช่วยให้สามารถสร้าง แก้ไข ดึงข้อมูล แปลง และเรนเดอร์เอกสาร HTML โดยไม่ต้องใช้ซอฟต์แวร์ภายนอก โปรด ดาวน์โหลด DLL ของ API หรือติดตั้งโดยใช้ NuGet
PM> Install-Package Aspose.Html
อ่านและแยก HTML โดยใช้ C#
เราสามารถอ่านและแยก HTML จากเอกสาร HTML ใด ๆ ได้โดยทำตามขั้นตอนด้านล่าง:
- โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
- แสดง HTML ภายในของไฟล์ไปยังคอนโซล
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการอ่านและแยกเนื้อหา HTML โดยใช้ C#
// ตัวอย่างโค้ดนี้สาธิตวิธีการแสดงเนื้อหาของเอกสาร HTML
// โหลดเอกสาร HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");
// แสดง HTML ภายในของเอกสาร
Console.WriteLine(document.Body.InnerHTML);
ในทำนองเดียวกัน เราสามารถอ่านและแยก HTML จากเว็บไซต์ที่ใช้งานจริงได้ดังที่แสดงด้านล่าง:
// ตัวอย่างโค้ดนี้สาธิตวิธีการแสดงเนื้อหาจาก URL ของเว็บไซต์ที่ใช้งานจริง
// เริ่มต้น Url
Url url = new Url("https://en.wikipedia.org/wiki/HTML");
// โหลดไฟล์ HTML โดยใช้อินสแตนซ์ Url
HTMLDocument document = new HTMLDocument(url);
// แสดง HTML ภายในของไฟล์ไปยังคอนโซล
Console.WriteLine(document.Body.InnerHTML);
ตรวจสอบองค์ประกอบเอกสารโดยใช้ C#
เราสามารถตรวจสอบเอกสารและองค์ประกอบต่างๆ ได้โดยทำตามขั้นตอนด้านล่าง:
- โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
- รับองค์ประกอบ HTML ของเอกสาร
- รับองค์ประกอบแรก/สุดท้ายขององค์ประกอบ HTML
- แสดงรายละเอียดองค์ประกอบเช่น TagName, TextContent
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการตรวจสอบองค์ประกอบเอกสารโดยใช้ C#
// ตัวอย่างโค้ดนี้สาธิตวิธีการตรวจสอบองค์ประกอบ HTML
// โหลดเอกสารจากไฟล์
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);
// รับองค์ประกอบ html ของเอกสาร
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML
// รับองค์ประกอบสุดท้ายขององค์ประกอบ html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY
// รับองค์ประกอบแรกขององค์ประกอบร่างกาย
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1
ค้นหาองค์ประกอบเฉพาะโดยใช้ตัวกรองใน C#
เราสามารถใช้ตัวกรองแบบกำหนดเองเพื่อค้นหาองค์ประกอบเฉพาะ เช่น รับรูปภาพทั้งหมด ลิงก์ ฯลฯ เพื่อจุดประสงค์นี้ API จึงจัดเตรียมอินเทอร์เฟซ TreeWalker ช่วยให้สามารถนำทางแผนผังเอกสารหรือแผนผังย่อยโดยใช้มุมมองของเอกสารที่กำหนดโดยแฟล็กและตัวกรอง whatToShow (ถ้ามี) เราสามารถค้นหาองค์ประกอบเฉพาะโดยใช้ตัวกรองโดยทำตามขั้นตอนด้านล่าง:
- กำหนดตัวกรองโดยใช้คลาส NodeFilter และแทนที่เมธอด AcceptNode()
- โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
- เรียกเมธอด CreateTreeWalker() ใช้โหนดรูท สิ่งที่จะแสดง และ NodeFilter เป็นอาร์กิวเมนต์
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีค้นหาองค์ประกอบเฉพาะโดยใช้ C#
// ตัวอย่างโค้ดนี้สาธิตวิธีการสืบค้นข้อมูลโดยใช้ตัวกรอง
// โหลดเอกสาร HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// ในการเริ่มการนำทาง HTML เราจำเป็นต้องสร้างอินสแตนซ์ของ TreeWalker
// พารามิเตอร์ที่ระบุหมายความว่าเริ่มเดินจากรากของเอกสาร
// วนซ้ำโหนดทั้งหมดและใช้ตัวกรองแบบกำหนดเองของเรา
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
while (iterator.NextNode() != null)
{
// เนื่องจากเราใช้ตัวกรองของเราเอง โหนดปัจจุบันจะเป็นอินสแตนซ์ของ HTMLImageElement เสมอ
// ดังนั้นเราจึงไม่จำเป็นต้องมีการตรวจสอบเพิ่มเติมที่นี่
var image = (HTMLImageElement)iterator.CurrentNode;
System.Console.WriteLine(image.Src);
// เอาท์พุต: image1.png
// เอาท์พุต: image2.png
}
}
// ตัวอย่างโค้ดนี้สาธิตวิธีการกำหนดตัวกรองโหนด
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
public override short AcceptNode(Aspose.Html.Dom.Node n)
{
// ตัวกรองปัจจุบันจะข้ามองค์ประกอบทั้งหมด ยกเว้นองค์ประกอบ IMG
return string.Equals("img", n.LocalName)
? FILTER_ACCEPT
: FILTER_SKIP;
}
}
สืบค้นข้อมูลจาก HTML โดยใช้ C#
นอกจากนี้เรายังสามารถใช้ XPath Query เพื่อสืบค้นข้อมูลจากเอกสาร HTML โดยทำตามขั้นตอนที่ระบุด้านล่าง:
- โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
- เรียกใช้เมธอด Evaluate() ใช้สตริงนิพจน์ XPath เอกสาร และพิมพ์เป็นอาร์กิวเมนต์
- สุดท้าย วนซ้ำโหนดผลลัพธ์และแสดงข้อความ
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการสืบค้นข้อมูลด้วยการสืบค้น XPath โดยใช้ C#
// ตัวอย่างโค้ดนี้สาธิตวิธีการสืบค้นข้อมูลโดยใช้แบบสอบถาม XPath
// เตรียมโค้ด HTML
var code = @"
<div class='happy'>
<div>
<span>Hello!</span>
</div>
</div>
<p class='happy'>
<span>World</span>
</p>
";
// เริ่มต้นเอกสารตามรหัสที่เตรียมไว้
HTMLDocument document = new HTMLDocument(code, ".");
// ที่นี่เราประเมินนิพจน์ XPath ที่เราเลือกองค์ประกอบ SPAN ลูกทั้งหมด
// จากองค์ประกอบที่แอตทริบิวต์ 'class' เท่ากับ 'happy':
var result = document.Evaluate("//*[@class='happy']//span",
document,
null,
Aspose.Html.Dom.XPath.XPathResultType.Any,
null);
// วนซ้ำโหนดผลลัพธ์
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
System.Console.WriteLine(node.TextContent);
// เอาท์พุต: สวัสดี
// เอาท์พุต: โลก!
}
แยกโดยใช้ตัวเลือก CSS ใน C#
เราสามารถแยกเนื้อหา HTML โดยใช้ตัวเลือก CSS ได้เช่นกัน เพื่อจุดประสงค์นี้ API จัดเตรียมเมธอด QuerySelectorAll() ที่ช่วยให้สามารถนำทางผ่านเอกสาร HTML และค้นหาองค์ประกอบที่จำเป็นได้ ใช้ตัวเลือกแบบสอบถามเป็นพารามิเตอร์และส่งกลับ NodeList ที่ตรงกันขององค์ประกอบทั้งหมด เราสามารถสอบถามโดยใช้ตัวเลือก CSS ได้โดยทำตามขั้นตอนด้านล่าง:
- โหลดเอกสาร HTML โดยใช้คลาส HTMLDocument
- เรียกใช้เมธอด QuerySelectorAll() ใช้ตัวเลือกแบบสอบถามเป็นอาร์กิวเมนต์
- สุดท้าย วนซ้ำรายการองค์ประกอบที่เป็นผลลัพธ์
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการแยกเนื้อหา HTML โดยใช้ตัวเลือก CSS ใน C#
// เริ่มต้นเอกสารตามรหัสที่เตรียมไว้
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");
// ที่นี่เราสร้างตัวเลือก CSS ที่แยกองค์ประกอบ div ทั้งหมด
var elements = document.QuerySelectorAll("div");
// วนซ้ำรายการองค์ประกอบผลลัพธ์
foreach (Aspose.Html.HTMLElement element in elements)
{
System.Console.WriteLine(element.InnerHTML);
}
รับใบอนุญาตฟรี
โปรดลองใช้ API โดยไม่มีข้อจำกัดในการประเมินโดยขอ ใบอนุญาตชั่วคราวฟรี
บทสรุป
ในบทความนี้ เราได้เรียนรู้วิธี:
- อ่านและแยกเนื้อหาของเอกสาร HTML โดยใช้ C#;
- ตรวจสอบองค์ประกอบเอกสารและค้นหาองค์ประกอบเฉพาะจาก HTML
- ข้อมูลเฉพาะการสืบค้นและดึงข้อมูลโดยใช้ตัวเลือก CSS
นอกจากนี้ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Aspose.HTML for .NET API ได้โดยใช้ เอกสารประกอบ ในกรณีที่มีความคลุมเครือ โปรดติดต่อเราที่ ฟอรั่ม