我正在尝试在页面上找到链接到某个域的任何链接,然后获取链接href
标记。
目前我正在这样做:
foreach(HtmlAgilityPack.HtmlNode link in entryNode.SelectNodes("//a[@href='*site.com*']"))
{
MessageBox.Show(imageLink.InnerHtml);
}
但我得到了这个例外:
对象引用未设置为对象的实例。
我也试过//a[@href=*site.com*]
没有运气,它说这是一个无效的令牌。
我需要在页面上找到链接到某个域的任何链接的XPath表达式是什么?另外,我将如何提取它们的href
属性(如果可能,在相同的XPath表达式中)。
感谢。
答案 0 :(得分: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[]
的开头添加一个点