Html Agility Pack を使用してサイトのHTMLを解析する
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(“<属性名>", “<初期値>")
ディスカッション
コメント一覧
まだ、コメントがありません