HTML 민첩성 팩을 사용하는 방법


629

HTML 민첩성 팩을 어떻게 사용 합니까?

내 XHTML 문서가 완전히 유효하지 않습니다. 그래서 제가 사용하고 싶었습니다. 프로젝트에서 어떻게 사용합니까? 내 프로젝트는 C #에 있습니다.


79
이 질문은 저에게 매우 도움이되었습니다.
BigJoe714

26
참고 : NuGet을 처리하는 Visual Studio에서 "참조"를 마우스 오른쪽 단추로 클릭하고 "NuGet 패키지 관리 ..."를 선택하고 "HtmlAgilityPack"을 검색 한 다음 "설치"를 클릭하십시오. 그런 다음 using / Import 문을 사용하여 코드를 연주하십시오.
patridge

@patridge의 위의 의견과 관련하여 : ankhsvn을 통해 svn에서 프로젝트를 처음 가져올 때 HtmlAgilityPack에 대한 참조를 제거한 다음 다시 추가해야한다는 것을 알았습니다.
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
        }
    }
}

(NB :이 코드는 예제 일 뿐이며 반드시 최선의 방법 일 필요는 없습니다. 자신의 응용 프로그램에서 맹목적으로 사용하지 마십시오.)

HtmlDocument.Load()메서드는 .NET 프레임 워크의 다른 스트림 지향 클래스와 통합하는 데 매우 유용한 스트림도 허용합니다. HtmlEntity.DeEntitize()HTML 엔티티를 올바르게 처리 하는 또 다른 유용한 방법입니다. (매튜 감사합니다)

HtmlDocument그리고 HtmlNode 당신이 가장 많이 사용하는 것이다 클래스입니다. XML 파서와 유사하게 XPath 표현식을 허용하는 selectSingleNode 및 selectNodes 메소드를 제공합니다.

HtmlDocument.Option?????? 부울 속성에 주의하십시오 . 이것 LoadLoadXML메소드가 HTML / XHTML을 처리 하는 방법을 제어합니다 .

HtmlAgilityPack.chm이라는 컴파일 된 도움말 파일도 있으며 각 개체에 대한 완전한 참조가 있습니다. 이것은 일반적으로 솔루션의 기본 폴더에 있습니다.


11
또한 Load는 Stream 매개 변수를 허용하므로 많은 상황에서 편리합니다. HTTP 스트림 (WebResponse.GetResponseStream)에 사용했습니다. 알아야 할 또 다른 좋은 방법은 HtmlEntity.DeEntitize (HTML Agility Pack의 일부)입니다. 경우에 따라 엔티티를 수동으로 처리하는 데 필요합니다.
Matthew Flaschen

1
참고 : Html Agility Pack (2009 년 10 월 3 일 릴리스 된 1.4.0 Beta 2)의 최신 베타 버전에서는 Sandcastle, DocProject 및 Visual Studio 2008 SDK에 대한 종속성으로 인해 도움말 파일이 별도의 다운로드로 이동되었습니다.
rtpHarry

SelectSingleNode() 얼마 전에 제거 된 것 같습니다
Chris S

3
아니요, SelectSingleNode 및 SelectNodes는 여전히 존재합니다. .Count가 아니라 htmlDoc.ParseErrors.Count () 여야한다는 것이 약간 흥미 롭습니다.
Mike Blandford

1
@MikeBlandford // 부분적으로 그렇습니다. PCL 버전의 HtmlAgailityPack에서 제거되었거나 처음부터 존재하지 않는 것 같습니다. nuget.org/packages/HtmlAgilityPack-PCL
Joon Hong

166

이것이 도움이 될지 모르겠지만 기본 사항을 소개하는 몇 가지 기사를 작성했습니다.

다음 기사는 95 % 완료되었습니다. 제가 작성한 코드의 마지막 몇 부분에 대한 설명 만 작성하면됩니다. 관심이 있으시면 게시 할 때 여기에 게시하는 것을 잊지 마십시오.



3
최근 코드 프로젝트 에서 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

또한 DocumentNode 객체에서 SelectNodes () 함수를 볼 수 없습니다. 이름이 바뀌 었습니까?
Piotrek

어떤 버전을 사용하고 있으며 어디에서 다운로드 했습니까? htmlagilitypack.codeplex.com/SourceControl/latest#Release/1_4_0/… 에 따르면 HtmlNode 클래스에는 SelectNodes 메소드가 있어야합니다.
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
웹 사이트는 더 이상 사용할 수 없습니다
디미타르 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.