使用 html 敏捷包获取 div 信息

get div information with html agility pack

你好我想在一个html页面上处理信息,用下面的代码我可以得到信息 订单是这样收到的

new-link-1

new-link-2

new-link-3

但是到了new-link-no-title部分,就打散了,变成了

new-link-3

new-link-1

new-link-2

并且在程序结束时它因 ArgumentOutOfRangeException 错误而停止

HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = await web.LoadFromWebAsync(Link);


    foreach ((var item, int index) in doc.DocumentNode.SelectNodes(".//div[@class='new-link-1']").WithIndex())
    {

        var x = item.SelectNodes("//div[@class='new-link-2']")[index].InnerText;

        var xx = item.SelectNodes("//div[@class='new-link-3']//a")[index];

        MessageBox.Show(item.InnerText);
        MessageBox.Show(x);
        MessageBox.Show(xx.Attributes["href"].Value);

    }

和html

<div id="new-link">
                <ul>
                <li>
                    <div class="new-link-1"> فصل پنجم</div>
                    <div class="new-link-2"> تکمیل شده</div>
                    <div class="new-link-3">
                        <a href="http://dlldsubtitle.info/Serial/1397/Silicon.Valley.S05_WorldSubtitle.zip">دانلود با لینک مستقیم</a>
                    </div>
                </li>

                <li class="new-link-no-titel">
                    <div class="new-link-1"> فصل ششم</div>
                    <div class="new-link-2"> درحال پخش</div>
                    <div class="new-link-3">
                        <i class="fa fa-arrow-down" title=حال پخش">

                        </i>
                    </div>
                </li>
                <li>
                    <divs="new-link-1"> قسمت 1</div>
                    <div class="new-link-2"> پخش شده</div>
                    <div class="new-link-3">
                        <a href="http://dl.worldsubtitle.info/Serial/1398/Silicon.Valley.S06E01_WorldSubtitle.zip">دانلودلینک مستقیم</a>
                    </div>
                </li>

                <li>
                    <div class="new-link-1"> قسمت 7</div>
                    <div class="new-link-2"> پخش شده</div>
                    <div class="new-link-3">
                        <a href="http://dl.worldsubtitle.info/Serial/1398/Silicon.Valley.S06E07_WorldSubtitle.zip">دانلود با لینک مستقیم</a>
                    </div>
                </li>
            </ul>
        </div>

这就是我发现您的代码存在的问题。

foreach ((var item, int index) in doc.DocumentNode.SelectNodes(".//div[@class='new-link-1']").WithIndex()) //-> Gives 4 indecies for index
item.SelectNodes("//div[@class='new-link-2']")    // -> This produces 4 nodes
item.SelectNodes("//div[@class='new-link-3']//a") // -> This produces only 3 nodes 

问题: 当您使用 //div 搜索时,您会搜索所有节点.. 而不仅仅是您当前所在的项目。

Solution/Suggestion: 您当前的代码从根节点开始搜索所有 a 元素。如果您用点作为前缀,则只会考虑当前节点的后代。 (Excerpt from here)

    foreach (HtmlNode item in doc.DocumentNode.SelectNodes(".//li"))
    {
        try
        {
            var x0 = item.SelectSingleNode(".//div[@class='new-link-1']");
            var x = item.SelectSingleNode(".//div[@class='new-link-2']");
            var xx = item.SelectSingleNode(".//a");

            MessageBox.Show(x0.InnerText);
            MessageBox.Show(x.InnerText);
            if (xx.Attributes["href"] != null)
                MessageBox.Show(xx.Attributes["href"].Value);
        }
        catch { }
    }