วิธีใช้ HTML Agility pack


629

ฉันจะใช้HTML Agility Pack ได้อย่างไร

เอกสาร XHTML ของฉันไม่ถูกต้อง นั่นเป็นเหตุผลที่ฉันต้องการใช้มัน ฉันจะใช้มันในโครงการของฉันได้อย่างไร โครงการของฉันอยู่ใน C #


79
คำถามนี้มีประโยชน์กับฉันมาก
BigJoe714

26
หมายเหตุด้านข้าง: ด้วย Visual Studio ที่จัดการ NuGet คุณสามารถคลิกขวาที่ "อ้างอิง" และเลือก "จัดการแพคเกจ NuGet ... " ค้นหา "HtmlAgilityPack" แล้วคลิก "ติดตั้ง" จากนั้นรับสิทธิ์ในการเล่นกับรหัสด้วยคำสั่งการใช้ / นำเข้า
patridge

เกี่ยวกับความคิดเห็นข้างต้นโดย @patridge: ฉันพบว่าฉันต้องการลบแล้วเพิ่มการอ้างอิงของฉันไปที่ HtmlAgilityPack อีกครั้งเมื่อเรียกโครงการจาก svn ผ่าน ankhsvn อีกครั้ง
Andrew Coonce

14
ใครก็ตามที่กำลังมองหา HTMLAgilityPack ควรพิจารณา CsQuery มันเป็นไลบรารี่ที่ใหม่กว่าพร้อมด้วยอินเตอร์เฟสที่ทันสมัยกว่าจากประสบการณ์ของฉัน ยกตัวอย่างเช่นโค้ดทั้งหมดจากคำตอบแรกที่สามารถสรุปได้ใน CsQuery var body = CQ.CreateFromFile(filePath)["body"]เป็น
Benjamin Gruenbaum

2
@BenjaminGruenbaum: ยกนิ้วให้กับคำแนะนำ CsQuery ของคุณ - ตั้งค่าในไม่กี่นาทีใช้งานง่ายมาก
Neolisk

คำตอบ:


358

ครั้งแรกที่ติดตั้งHTMLAgilityPackแพคเกจ nuget ในโครงการของคุณ

จากนั้นเป็นตัวอย่าง:

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

// There are various options, set as needed
htmlDoc.OptionFixNestedTags=true;

// filePath is a path to a file containing the html
htmlDoc.Load(filePath);

// Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)

// ParseErrors is an ArrayList containing any errors from the Load statement
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
{
    // Handle any parse errors as required

}
else
{

    if (htmlDoc.DocumentNode != null)
    {
        HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");

        if (bodyNode != null)
        {
            // Do something with bodyNode
        }
    }
}

(หมายเหตุ: รหัสนี้เป็นตัวอย่างเท่านั้นและไม่จำเป็นต้องเป็นวิธีการที่ดีที่สุด / อย่างเดียวอย่าใช้อย่างสุ่มสี่สุ่มห้าในแอปพลิเคชันของคุณเอง)

HtmlDocument.Load()วิธียังยอมรับกระแสซึ่งเป็นประโยชน์อย่างมากในการบูรณาการกับกระแสเชิงชั้นเรียนอื่น ๆ ในกรอบ NET ที่ ในขณะที่HtmlEntity.DeEntitize()เป็นอีกวิธีที่มีประโยชน์สำหรับการประมวลผลหน่วยงาน HTML ได้อย่างถูกต้อง (ขอบคุณ Matthew)

HtmlDocumentและHtmlNode เป็นชั้นเรียนที่คุณจะใช้มากที่สุด คล้ายกับตัวแยกวิเคราะห์ XML ซึ่งจัดเตรียมเมธอด selectSingleNode และ selectNodes ที่ยอมรับนิพจน์ XPath

ให้ความสนใจกับHtmlDocument.Option?????? คุณสมบัติบูลีน ควบคุมวิธีการLoadและLoadXMLวิธีการเหล่านี้ในการประมวลผล HTML / XHTML ของคุณ

นอกจากนี้ยังมีไฟล์ช่วยเหลือที่คอมไพล์ชื่อ HtmlAgilityPack.chm ซึ่งมีการอ้างอิงที่สมบูรณ์สำหรับแต่ละออบเจ็กต์ โดยปกติจะอยู่ในโฟลเดอร์ฐานของโซลูชัน


11
นอกจากนี้โปรดทราบว่าการโหลดยอมรับพารามิเตอร์สตรีมซึ่งสะดวกในหลาย ๆ สถานการณ์ ฉันใช้มันสำหรับสตรีม HTTP (WebResponse.GetResponseStream) อีกวิธีที่ดีที่ควรระวังคือ HtmlEntity.DeEntitize (ส่วนหนึ่งของ HTML Agility Pack) สิ่งนี้จำเป็นสำหรับการประมวลผลเอนทิตีด้วยตนเองในบางกรณี
Matthew Flaschen

1
หมายเหตุ: ในรุ่นเบต้าล่าสุดของ Html Agility Pack (1.4.0 Beta 2 วางจำหน่าย 3 ตุลาคม 2009) ไฟล์ความช่วยเหลือได้ถูกย้ายออกไปเป็นการดาวน์โหลดแยกต่างหากเนื่องจากการพึ่งพา Sandcastle, DocProject และ Visual Studio 2008 SDK
rtpHarry

SelectSingleNode() ดูเหมือนว่าจะถูกลบออกในขณะที่ผ่านมา
Chris S

3
ไม่ SelectSingleNode และ SelectNodes ยังคงอยู่ที่นั่นอย่างแน่นอน ฉันพบว่าน่าสนใจเล็กน้อยว่าควรเป็น htmlDoc.ParseErrors.Count () ไม่ใช่ .Count
Mike Blandford

1
@MikeBlandford // ใช่บางส่วน ดูเหมือนว่าจะถูกลบออก (หรือไม่มีอยู่ตั้งแต่ต้น) ที่เวอร์ชัน HtmlAgailityPack รุ่น PCL nuget.org/packages/HtmlAgilityPack-PCL
Joon Hong

166

ฉันไม่รู้ว่าสิ่งนี้จะช่วยคุณได้หรือไม่ แต่ฉันได้เขียนบทความสองสามฉบับที่แนะนำพื้นฐาน

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



3
เมื่อเร็ว ๆ นี้ในโครงการ Codeมันได้เปิดตัวบทความ HTMLAgilityPack ที่ดีมาก คุณสามารถอ่านได้ที่นี่
Victor Sigler

64

HtmlAgilityPack ใช้ไวยากรณ์ XPath และแม้ว่าหลายคนแย้งว่าเป็นเอกสารที่ไม่ดีฉันก็ไม่มีปัญหาในการใช้มันด้วยความช่วยเหลือจากเอกสาร XPath นี้: https://www.w3schools.com/xml/xpath_syntax.asp

ในการแยกวิเคราะห์

<h2>
  <a href="">Jack</a>
</h2>
<ul>
  <li class="tel">
    <a href="">81 75 53 60</a>
  </li>
</ul>
<h2>
  <a href="">Roy</a>
</h2>
<ul>
  <li class="tel">
    <a href="">44 52 16 87</a>
  </li>
</ul>

ฉันทำอย่างนี้:

string url = "http://website.com";
var Webget = new HtmlWeb();
var doc = Webget.Load(url);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//h2//a"))
{
  names.Add(node.ChildNodes[0].InnerHtml);
}
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//li[@class='tel']//a"))
{
  phones.Add(node.ChildNodes[0].InnerHtml);
}

จริงทั้งหมด มันขึ้นอยู่กับXPathมาตรฐานอย่างเต็มที่ หนึ่งควรเรียนรู้ว่ามาตรฐานและทุกอย่างจะง่ายหลังจากนั้น
FindOut_Quran

ลิงก์ที่คุณระบุไม่สามารถใช้ได้อีกต่อไป นี่น่าจะเป็นอันใหม่: w3schools.com/xsl/xpath_syntax.asp
Piotrek

ฉันยังไม่เห็นฟังก์ชั่น SelectNodes () ในวัตถุ DocumentNode มันเปลี่ยนชื่อหรือไม่
Piotrek

คุณใช้เวอร์ชันใดและคุณดาวน์โหลดจากที่ใด ตามhtmlagilitypack.codeplex.com/SourceControl/latest#Release/1_4_0/ ......ควรมีเมธอด SelectNodes ในคลาส HtmlNode
Kent Munthe Caspersen

ไม่สามารถใช้ลิงก์ได้ลิงก์ใหม่: www.w3schools.com/xml/xpath_syntax.asp
Tyrmos

6

HTMLAgilityPack รหัสหลักที่เกี่ยวข้องมีดังนี้

using System;
using System.Net;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Text.RegularExpressions;
using HtmlAgilityPack;

namespace GetMetaData
{
    /// <summary>
    /// Summary description for MetaDataWebService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    [System.Web.Script.Services.ScriptService]
    public class MetaDataWebService: System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(UseHttpGet = false)]
        public MetaData GetMetaData(string url)
        {
            MetaData objMetaData = new MetaData();

            //Get Title
            WebClient client = new WebClient();
            string sourceUrl = client.DownloadString(url);

            objMetaData.PageTitle = Regex.Match(sourceUrl, @
            "\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;

            //Method to get Meta Tags
            objMetaData.MetaDescription = GetMetaDescription(url);
            return objMetaData;
        }

        private string GetMetaDescription(string url)
        {
            string description = string.Empty;

            //Get Meta Tags
            var webGet = new HtmlWeb();
            var document = webGet.Load(url);
            var metaTags = document.DocumentNode.SelectNodes("//meta");

            if (metaTags != null)
            {
                foreach(var tag in metaTags)
                {
                    if (tag.Attributes["name"] != null && tag.Attributes["content"] != null && tag.Attributes["name"].Value.ToLower() == "description")
                    {
                        description = tag.Attributes["content"].Value;
                    }
                }
            } 
            else
            {
                description = string.Empty;
            }
            return description;
        }
    }
}

4
เว็บไซต์ไม่สามารถใช้งานได้อีกต่อไป
Dimitar Tsonev

5
    public string HtmlAgi(string url, string key)
    {

        var Webget = new HtmlWeb();
        var doc = Webget.Load(url);
        HtmlNode ourNode = doc.DocumentNode.SelectSingleNode(string.Format("//meta[@name='{0}']", key));

        if (ourNode != null)
        {


                return ourNode.GetAttributeValue("content", "");

        }
        else
        {
            return "not fount";
        }

    }

0

เริ่มต้นใช้งาน - ชุดความคล่องตัวของ HTML

// From File
var doc = new HtmlDocument();
doc.Load(filePath);

// From String
var doc = new HtmlDocument();
doc.LoadHtml(html);

// From Web
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var doc = web.Load(url);

0

ลองนี้

string htmlBody = ParseHmlBody(dtViewDetails.Rows[0]["Body"].ToString());

private string ParseHmlBody(string html)
        {
            string body = string.Empty;
            try
            {
                var htmlDoc = new HtmlDocument();
                htmlDoc.LoadHtml(html);
                var htmlBody = htmlDoc.DocumentNode.SelectSingleNode("//body");
                body = htmlBody.OuterHtml;
            }
            catch (Exception ex)
            {

                dalPendingOrders.LogMessage("Error in ParseHmlBody" + ex.Message);
            }
            return body;
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.