HTML Agility Packの使い方


629

HTML Agility Packはどのように使用しますか?

XHTMLドキュメントが完全に有効ではありません。だから私はそれを使いたかったのです。プロジェクトでどのように使用しますか?私のプロジェクトはC#です。


79
この質問は私にとても役に立ちました。
BigJoe714 2010年

26
注:NuGetを処理するVisual Studioでは、[参照]を右クリックして[NuGetパッケージの管理...]を選択し、「HtmlAgilityPack」を検索して[インストール]をクリックできます。次に、using / Importステートメントを使用してコードを操作します。
パトリッジ

@patridgeによる上記のコメントについて:最初にankhsvnを介してsvnからプロジェクトをフェッチするときに、HtmlAgilityPackへの参照を削除してから再度追加する必要があることがわかりました。
Andrew Coonce 2013年

14
HTMLAgilityPackを検討している人は、CsQueryを検討する必要があります。これは、私の経験からのはるかに新しいインターフェイスを備えた、はるかに新しいライブラリです。たとえば、最初の回答のコード全体は、CsQueryで次のように合計できますvar body = CQ.CreateFromFile(filePath)["body"]
Benjamin Gruenbaum 2014年

2
@BenjaminGruenbaum:CsQueryの提案に賛成-数分で設定でき、非常に使いやすい。
Neolisk、2014年

回答:


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エンティティを処理するための別の有用な方法です。(マシューに感謝)

HtmlDocumentそしてHtmlNode 、最もよく使用するクラスです。XMLパーサーと同様に、XPath式を受け入れるselectSingleNodeおよびselectNodesメソッドを提供します。

HtmlDocument.Option?????? ブール値のプロパティに注意してください。これらは、LoadおよびLoadXMLメソッドがHTML / XHTMLを処理する方法を制御します。

また、HtmlAgilityPack.chmと呼ばれるコンパイルされたヘルプファイルには、各オブジェクトの完全なリファレンスがあります。これは通常、ソリューションのベースフォルダにあります。


11
また、LoadはStreamパラメータを受け入れるため、多くの状況で便利です。HTTPストリーム(WebResponse.GetResponseStream)に使用しました。注意すべきもう1つの方法は、HtmlEntity.DeEntitize(HTML Agility Packの一部)です。エンティティを手動で処理する場合に必要になります。
Matthew Flaschen、2009年

1
注:Html Agility Packの最新ベータ版(2009年10月3日リリースの1.4.0 Beta 2)では、Sandcastle、DocProject、およびVisual Studio 2008 SDKに依存しているため、ヘルプファイルは別のダウンロードに移動されました。
rtpHarry 2010

SelectSingleNode() 少し前に削除されたようです
クリスS

3
いいえ、SelectSingleNodeとSelectNodesは確かにまだあります。.CountではなくhtmlDoc.ParseErrors.Count()であることが少し興味深いと思います
Mike Blandford

1
@MikeBlandford //部分的にはい。PCLバージョンのHtmlAgailityPackで削除された(または最初から存在しなかった)ようです。nuget.org/packages/HtmlAgilityPack-PCL
Joon Hong

166

これがあなたに役立つかどうかはわかりませんが、基本を紹介する記事をいくつか書いています。

次の記事は95%完成しています。私が書いたコードの最後のいくつかの部分の説明を書く必要があります。あなたが興味があるなら、私はそれを公開するときにここに投稿することを忘れないようにしようとします。



3
最近、Code Projectで、HTMLAgilityPackの非常に優れた記事がリリースされました。あなたはそれをここで
Victor Sigler '19 / 02/19

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
ピオトレック

また、DocumentNodeオブジェクトにSelectNodes()関数が表示されません。名前は変更されましたか?
ピオトレック

どのバージョンを使用していて、どこからダウンロードしましたか?htmlagilitypack.codeplex.com/SourceControl/latest#Release/1_4_0/…によると、HtmlNodeクラスにSelectNodesメソッドがあるはずです。
Kent Munthe Caspersen、2016年

リンクは利用できません。新しいリンク: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
Webサイトは利用できなくなりました
Dimitar Tsonev、2015

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 Agility Pack

// 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.