どうも断片的な記事しかないみたいなので、かき集めたネタをまとめておくわね。
ふたつの書き方まで覚えてるわ。
string source = "(HTMLソース)"; string xpath = "xpathコード"; string r = ""; HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument(); html.LoadHtml(source); try { var articles = html.DocumentNode.SelectNodes(@xpath) .Select(a => new { Data = a.InnerText }); foreach (var a in articles) { string kg = "\r\n"; string x1 = a.Data + kg; r += x1; }
うちでよく使う方法ね。対象のブツが一つでも複数あっても処理次第だから。
こちらは、単発のデータでゲットするみたい。たとえば。
HtmlNode doc = html.DocumentNode.SelectSingleNode(@"//title"); Console.WriteLine(doc.InnerText);
タイトルを探し出して取り込む。最初からひとつとわかってる場合は便利よね。
ついでにこっちも。今まで見たパターンね。
//a
ページ内部にある、全ての aタグを探すの。
ただ、これだけだと使いにくいのよね。たとえば、こんな感じかしら。
var articles = html.DocumentNode.SelectNodes(@xpath) .Select(a => new { Html = a.InnerText, Link = a.Attributes["href"].Value.Trim() }); foreach (var a in articles) { string kg = "\r\n"; string x1 = a.Html + "(" + a.Link + ")" + kg; r += x1; }
Attributesの意味は属性が近いのかしら。HTMLのAタグにとつて囲い込んだテキストが値であって、リンクの書かれた href は属性情報という事ね。
ちなみに、class=やid=のついた a タグだけ取り込むなら、こう。
//a[@id='honbun']
classでも同じようにして書くと、同ページの中にある id="honbun" つきの a タグを全部取り出せるってわけ。
うちではこれの応用で『小説家になろう』サイトのお気に入り小説更新情報をもらってきているのだけど、これもこんな感じで一行で書けるの。
//div[@class='favnovel_list']//a
ね。
なお、Attributes みたいなやつは他にこんなのもあるらしいわ。
/html[1]/body[1]/div[1]...
これは特定タグ狙いでなくツリー構造で追いかけるみたい。
堅実に見えるけど、ページ構造が変わったら容易にデータがとれなくなるのよね。
個人的にはclassやidで追いかけるのをお勧めするかな。
だって、classやidを定義するのは「この情報はなに」って人間に見やすく属性をつけられている場合が多いから。文書構造を変える事はデザイン変更などでよくあるけど、見た目と関係ないclass値は一度決まったら簡単に変わらないと思うのよね。