複数の選択肢を持つタグを解析するC#Html Agility Pack

c# html html-agility-pack tags

質問

私はHTMLに関する経験がないので、間違った用語を許してください。

HTML Agile Packを使用してHTML文書を解析しようとしていますが、非常に特定の文字列を探しています。

私はフォームのすべての文字列を取得したい:

<img src="..." etc=....">

だから私の選択パラメータは

<img src="..." etc=....">

しかし、これはまた、

<img src="..." etc=....">

私の知る限りでは、少なくとも私には思われます。imgタグが検索され、srcはimgタグのすぐ隣にある必要はなく、同じレベルにある必要があります。

ドキュメンテーションを見た後、私はこの機能で許可されていないことをしようとしています。

誰かがこれを行う正しい方法を提案してもらえますか?ありがとう!

受け入れられた回答

msgstr "" " imgタグが検索され、 srcは同じレベルにある必要があります。必ずしもimgタグのすぐ隣にある必要はありません。 "

src属性が最初の属性である<img>要素を探したいと思うようです。 XML / HTMLパーサーは属性の順序を保持する必要はないので、通常は特定の属性の順序、つまりsrc属性が最初に来る場所などに基づいて要素を選択したくないことに注意してください。

とにかく、私の過度に単純化されたテストでは、HAPによって属性の順序が保持されるため、 Attributes[0].Name *を使用して、働いた最初の属性の名前を確認します。

var raw = @"<div>
    <img src=""..."" etc=""...."">
    <img width=""..."" src=""..."" etc="".."">
    <img>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
var result = doc.DocumentNode
                .SelectNodes("//img[@src]")
                .Where(o => o.Attributes[0].Name == "src")
                .ToList();
foreach (var item in result)
{
    Console.WriteLine(item.OuterHtml);
}

出力:

var raw = @"<div>
    <img src=""..."" etc=""...."">
    <img width=""..."" src=""..."" etc="".."">
    <img>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
var result = doc.DocumentNode
                .SelectNodes("//img[@src]")
                .Where(o => o.Attributes[0].Name == "src")
                .ToList();
foreach (var item in result)
{
    Console.WriteLine(item.OuterHtml);
}

*)XPathはすでに属性srcを持つimg要素をフィルタリングします。そのため、 Attributes[0].NameはNREを生成しません。


人気のある回答

私はXPATHに慣れていないので、あなたのものが正しいと仮定しています(私は通常、HtmlAgilityPackに加えてScrapySharpライブラリを使ってCSSセレクタを使用します)。

次のConsoleプロジェクトコードスニペットは、必要なimgノード、つまり2つの属性のみを持つimgノード(srcなど)を返します。私は次のように3つのイメージノードを持つサンプルhtmlを手動で読み込みます:

        HtmlDocument doc = new HtmlDocument();
        string html = @"
            <img src='img1.jpg' />
            <img src='img1.jpg' etc='etcValue' />
            <img width='200px' src='img1.jpg' />
        ";
        doc.LoadHtml(html);

        var relevantImgNodes = doc.DocumentNode.SelectNodes("//img")
            .Where(n => 
                n.Attributes.Count == 2 && 
                !string.IsNullOrEmpty(n.GetAttributeValue("src")) && 
                !string.IsNullOrEmpty(n.GetAttributeValue("etc")));

        Console.WriteLine(relevantImgNodes.Count()); // prints 1



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ