.NET

どうも断片的な記事しかないみたいなので、かき集めたネタをまとめておくわね。

取り込み方

ふたつの書き方まで覚えてるわ。

DocumentNode.SelectNodes

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;
  }

うちでよく使う方法ね。対象のブツが一つでも複数あっても処理次第だから。

DocumentNode.SelectSingleNode

こちらは、単発のデータでゲットするみたい。たとえば。

HtmlNode doc = html.DocumentNode.SelectSingleNode(@"//title");
Console.WriteLine(doc.InnerText);

タイトルを探し出して取り込む。最初からひとつとわかってる場合は便利よね。

Xpathの書き方

ついでにこっちも。今まで見たパターンね。

「特定タグの取り込み」

//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値は一度決まったら簡単に変わらないと思うのよね。

トラブルシューティング

処理中のところで止まっちゃう
HtmlAgilityPackのDLLを同じフォルダに置いてないですよね。特にインストールせずに実行ファイルだけコピーした時にやりがちですけど、DLLもちゃんと入れてください。

トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-19 (金) 19:07:17