通过HtmlAgilityPack获取属性的值

时间:2014-01-20 14:20:07

标签: c# html-agility-pack

我想通过HtmlAgilityPack获取属性的值。 Html代码:

<link href="style.css">
<link href="anotherstyle.css">
<link href="anotherstyle2.css">
<link itemprop="thumbnailUrl" href="http://image.jpg">
<link href="anotherstyle5.css">
<link href="anotherstyle7.css">

我想获得最后一个href属性。

我的c#代码:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument htmldoc = web.Load(Url);
htmldoc.OptionFixNestedTags = true;
var navigator = (HtmlNodeNavigator)htmldoc.CreateNavigator();
string xpath = "//link/@href";
string val = navigator.SelectSingleNode(xpath).Value;

但该代码返回第一个href值。

5 个答案:

答案 0 :(得分:14)

在XPath之后选择link个已定义href属性的元素。然后从您选择最后一个链接:

var link = doc.DocumentNode.SelectNodes("//link[@href]").LastOrDefault();
// you can also check if link is not null
var href = link.Attributes["href"].Value; // "anotherstyle7.css"

您还可以使用last() XPath运算符

var link = doc.DocumentNode.SelectSingleNode("/link[@href][last()]");
var href = link.Attributes["href"].Value;

更新:如果您想获取同时具有itemprophref属性的最后一个元素,那么如果您要使用XPath //link[@href and @itemprop][last()]//link[@href and @itemprop]第一种方法。

答案 1 :(得分:3)

你需要这样的东西:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument htmldoc = web.Load(Url);
htmldoc.OptionFixNestedTags = true;
var navigator = (HtmlNodeNavigator)htmldoc.CreateNavigator();
string xpath = "//link[@itemprop]/@href";
string val = navigator.SelectSingleNode(xpath).Value;

答案 2 :(得分:1)

将网页加载为Htmldocument并直接选择最后一个链接标记。

        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(Url);
        var output = doc.DocumentNode.SelectNodes("//link[@href]").LastOrDefault();
        var data = output.Attributes["href"].Value;

或 将网页加载为Htmldocument并获取所有选定链接标记的集合 然后使用循环进行旅行,然后访问最后一个选择标签属性。

        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(Url);
        int count = 0;
        string data = "";
        var output = doc.DocumentNode.SelectNodes("//link[@href]");

        foreach (var item in output)
        {
            count++;
            if (count == output.Count)
            {
                data=item.Attributes["href"].Value;
                break;
            }
        }

答案 3 :(得分:0)

好的,我来到这里:

var link = htmldoc.DocumentNode.SelectSingleNode("//link[@itemprop='thumbnailUrl']");
var href = link.Attributes["href"].Value;

答案 4 :(得分:0)

通过属性值获取HtmlNode:

public static class Extensions
{
    public static HtmlNode GetNodeByAttributeValue(this HtmlNode htmlNode, string attributeName, string attributeValue)
    {
        if (htmlNode.Attributes.Contains(attributeName))
        {
            if (string.Compare(htmlNode.Attributes[attributeName].Value, attributeValue, true) == 0)
            {
                return htmlNode;
            }
        }

        foreach (var childHtmlNode in htmlNode.ChildNodes)
        {
            var resultNode = GetNodeByAttributeValue(childHtmlNode, attributeName, attributeValue);
            if (resultNode != null) return resultNode;
        }

        return null;
    }
}

用法

var searchResultsDiv = pageDocument.DocumentNode.GetNodeByAttributeValue("someattributename", "resultsofsearch");