web-dev-qa-db-ja.com

HtmlAgilityPackによって属性の値を取得する

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値を返します。

11
denied

次の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]_を使用します。アプローチ。

17

あなたはそのようなものが必要です:

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;
3
elyashiv

htmldocumentとしてWebページを読み込み、最後のリンクタグを直接選択します。

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

または、Webページを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;
            }
        }
2
SiwachGaurav

属性値で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");
1

わかりました、私はこれに来ました:

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