0

このhtmlスニペットから両方のソース属性を抽出したいと思います。

<audio controls>
<source src="horse.mp3" type="audio/mpeg">
<source src="horse.ogg" type="audio/ogg">
<embed height="50" width="100" src="horse.mp3">
</audio>

これが私がすることです:

まず最初に、すべてのオーディオタグ(上記で表示されているものを含む)を抽出します。

var audio_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_AUDIO); 

その後、次のコードを使用して、HtmlNodeCollectionaudio_tagsからを使用してソース要素を抽出しようとします。

foreach (HtmlNode link in audio_tags)
        {
            if (link != null)
            {
                string url;
                string type;
                // select all source tags, see here for an example: http://www.w3schools.com/html/html_sounds.asp
                if(link.HasChildNodes)
                {
                    var children = link.ChildNodes;
                    if (children != null)
                    {
                        foreach (HtmlNode child in children)
                        {
                            Console.WriteLine(children[0].GetAttributeValue("type", "err").ToString() + "||" + children[0].OriginalName);
                            Console.WriteLine(children[1].GetAttributeValue("type", "errrr").ToString() + "||" + children[1].OriginalName);
 ...

書き込み行は、「err」が出力されるため、最初の要素が存在しないことを示しています。しかし、それはむしろ最初のソース要素であるべきです。私はいくつかのヒントについてうれしいです。

編集:

これらの書き込みラインからの出力は次のとおりです。

 err||#text
 audio/mpeg||source

そしてnr。子供の要素の2です。

4

1 に答える 1

1

最初の問題は、<source>タグが閉じられていないことです。<source>AgilityPackは、2番目のタグと<embed>タグが最初のタグ内にあるように自動的に閉じます<source>。しかし、AgilityPackは、それが自己終了タグであることを認識しています。<embed>幸いなことに、タグを自己終了タグとして扱いたいと言う方法があります。

HtmlNode.ElementsFlags.Add("source", HtmlElementFlag.Empty);

2番目の問題はテキストノードです。すべての改行/スペースシーケンスはテキストノードに変換されます。私はあなたがそれらを取り除きたいと思うので、これらの種類のノードはスキップされるかもしれません。

最後に、AgilityPackでLINQまたはxpathを使用することで、コードの可読性を向上させることができます。次に例を示します。

doc.LoadHtml(html);
doc.DocumentNode
    .Descendants("audio")
    .SelectMany(a =>
        a.ChildNodes.Where(n => n.GetType() != typeof(HtmlTextNode))
    ).ToList()
    .ForEach(n => 
        Console.WriteLine("{0}||{1}", n.GetAttributeValue("type", "err"), n.OriginalName)
    );

これにより、次のようになります。

audio/mpeg||source 
audio/ogg||source 
err||embed
于 2013-02-06T18:40:44.303 に答える