C# 使用HtmlAgilityPack解析rel规范

C# 使用HtmlAgilityPack解析rel规范,c#,html-agility-pack,C#,Html Agility Pack,如何从html文档解析带有URL的rel=“canonical”标记 我想在这里找到url: <link rel="canonical" href="http://stackoverflow.com/questions/2593147/html-agility-pack-make-code-look-neat" /> 假设doc是您的HtmlDocument对象 HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//l

如何从html文档解析带有URL的rel=“canonical”标记

我想在这里找到url:

<link rel="canonical" href="http://stackoverflow.com/questions/2593147/html-agility-pack-make-code-look-neat" />

假设
doc
是您的
HtmlDocument
对象

HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//link[@rel]");
应该为您获取具有
rel
属性的
链接
元素。现在迭代:

foreach (HtmlNode link in links)
{
    string url;
    if (link.Attributes["rel"] == "canonical") {
        url = link.Attributes["href"];
    }
}
此外,还可以在SelectNodes调用中过滤链接,只获取带有“canonical”的链接:
doc.DocumentNode.SelectNodes(“//link[@rel='canonical']”)


未测试代码,但您得到了以下想法:)

假设
doc
是您的
HtmlDocument
对象

HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//link[@rel]");
应该为您获取具有
rel
属性的
链接
元素。现在迭代:

foreach (HtmlNode link in links)
{
    string url;
    if (link.Attributes["rel"] == "canonical") {
        url = link.Attributes["href"];
    }
}
此外,还可以在SelectNodes调用中过滤链接,只获取带有“canonical”的链接:
doc.DocumentNode.SelectNodes(“//link[@rel='canonical']”)


未测试代码,但您得到的想法是:)

接受的答案不再正确,更新的代码如下:

var links = htmlDoc.DocumentNode.SelectNodes("//link[@rel]");

string canonical;

foreach (HtmlNode link in links)
{
    if (link.Attributes["rel"].Value == "canonical")
    {
        canonical = link.Attributes["href"].Value;
    }
}

接受的答案不再正确,更新代码如下:

var links = htmlDoc.DocumentNode.SelectNodes("//link[@rel]");

string canonical;

foreach (HtmlNode link in links)
{
    if (link.Attributes["rel"].Value == "canonical")
    {
        canonical = link.Attributes["href"].Value;
    }
}

//link[@rel='canonical']
不是更容易吗?我正要说,是:)难道
//link[@rel='canonical']
不是更容易吗?我正要说,是:)接受的答案有什么问题?它似乎仍然有效?单引号和双引号可能有问题吗?@MossPalmer这是几个月前的事了,但IIRC你现在需要这个值啊,是的。谢谢你澄清这一点。我连看都没看就加上了。在你的回答中可能值得注意。谢谢。我原以为//link[@rel]='canonical'是您标记为错误的部分,但它仍然可以正常工作。canonical=link.GetAttributeValue(“href”,null)怎么样;而不是canonical=link.Attributes[“href”].Value;如果链接属性为空,这将引发异常接受的答案有什么问题?它似乎仍然有效?单引号和双引号可能有问题吗?@MossPalmer这是几个月前的事了,但IIRC你现在需要这个值啊,是的。谢谢你澄清这一点。我连看都没看就加上了。在你的回答中可能值得注意。谢谢。我原以为//link[@rel]='canonical'是您标记为错误的部分,但它仍然可以正常工作。canonical=link.GetAttributeValue(“href”,null)怎么样;而不是canonical=link.Attributes[“href”].Value;如果链接属性为null,则会引发异常