Html Agility Pack を使用してサイトのHTMLを解析する

2020-03-25

Html Agility Pack を使用すると、HTMLタグがオブジェクトのように扱え、
簡単に解析を行うことができる。

private void button1_Click(object sender, EventArgs e)
{
    string strSource = "";

    // ソースのダウンロード
    using (System.Net.WebClient objWebClient = new System.Net.WebClient())
    {
        objWebClient.Encoding = System.Text.Encoding.UTF8;
        strSource = objWebClient.DownloadString("https://news.google.co.jp/");
    }

    // HTMLの解析
    HtmlAgilityPack.HtmlDocument objHTMLDocument = new HtmlAgilityPack.HtmlDocument();
    objHTMLDocument.LoadHtml(strSource);

    // 単一のタグを検出
    HtmlAgilityPack.HtmlNode objTopNewsNode = objHTMLDocument.DocumentNode.SelectSingleNode("//div[contains(@class, 'section-ja_jp-t')]");

    HtmlAgilityPack.HtmlNode objTopNewsNameNode = objTopNewsNode.SelectSingleNode("*//span[@class='section-name']");
    Console.WriteLine("TopNewsName:" + objTopNewsNameNode.InnerText);

    // 複数のタグを検出
    HtmlAgilityPack.HtmlNodeCollection objNewsDataNodeCollection = objTopNewsNode.SelectNodes("*//h2[@class='esc-lead-article-title']/a[starts-with(@class, 'article')]");

    foreach (HtmlAgilityPack.HtmlNode objNewsDataNode in objNewsDataNodeCollection)
    {
        HtmlAgilityPack.HtmlNode objNewsTitleNode = objNewsDataNode.SelectSingleNode("span");
        string strTitle = objNewsTitleNode.InnerText;

        // 属性の取得
        string strURL = objNewsDataNode.GetAttributeValue("href", "");

        Console.WriteLine(strTitle + ":" + strURL);
    }
}

ノードの指定はXPathを用いる。

  • 全てのノードから抽出://<タグ名>
  • 指定したノード配下にある全てのノードから抽出:*//<タグ名>
  • 属性の値を指定して抽出:<タグ名>[@<属性名>='<属性値>’]
  • 指定した属性の値を含むものを抽出:<タグ名>[contains(@<属性名>, '<属性値>’)]
  • 指定した属性の値で始まるものを抽出:<タグ名>[starts-with(@<属性名>, '<属性値>’)]
  • テキストに指定した値が含まれるものを抽出:<タグ名>[contains(., '<値>’)]
  • タグの値を取得:InnerHtml / InnerText / OuterHtml
  • タグの属性を取得:GetAttributeValue(“<属性名>", “<初期値>")