0

特定のドメインにリンクしているページ上のリンクを見つけて、リンクhrefタグを取得しようとしています。

現時点では、私はこれをやっています:

foreach(HtmlAgilityPack.HtmlNode link in entryNode.SelectNodes("//a[@href='*site.com*']"))
{
    MessageBox.Show(imageLink.InnerHtml);
}

しかし、私はこの例外を受けています:

オブジェクト参照がオブジェクト インスタンスに設定されていません。

私も//a[@href=*site.com*]運が悪かったのですが、無効なトークンであると言われました。

特定のドメインにリンクしているページ上のリンクを見つけるために必要な XPath 式は何ですか? また、それらの属性を抽出するにはどうすればよいでしょうかhref(可能であれば同じ XPath 式で)。

ありがとう。

4

1 に答える 1

0

XPath にはcontainsそのためのメソッドがあるため、次のように簡単です。

var urls = new List<Uri>();
var url = new Uri("http://stackoverflow.com/questions/12131954/");
using (var client = new WebClient())
{
  var doc = new HtmlDocument();
  doc.Load(client.OpenRead(url));
  var links = doc.DocumentNode.SelectNodes("//a[contains(@href,'stackoverflow.com')]");
  foreach (var link in links)
  {
    var uri = new Uri(url, link.Attributes["href"].Value); //fixes relative Urls
    if (uri.Scheme.StartsWith("http"))
    {
      urls.Add(uri);
    }
  }
  Console.WriteLine(urls);
}

または、Linq を使用してリンクを取得することもできます

var links = doc.DocumentNode.Descendants("a")
  .Where(a => a.Attributes["href"] != null
      && a.Attributes["href"].Value.ToLower().Contains("stackoverflow.com"));

また、子ノードから一致しているようです。同じ XPath を使用する場合は、文字列の先頭にドットを追加する必要があります.//a[]

于 2012-08-26T17:09:36.860 に答える