【问题标题】:Html Agility Pack get specific content inside a double divHtml Agility Pack 在双 div 中获取特定内容
【发布时间】:2011-11-19 14:24:02
【问题描述】:

我是 HTML Agility 包的新手,我还没有弄清楚如何解析以下代码块:

<p>
    <div class='myclass1'>
        <div id='idXXXX'>content1<br>content2
        </div>  
        <div class="myclass2">
            <table>
                <tr>
                    <td align="left">content3 <b><a href="">content4</a></b></td>
                    <td align="right">content5 <b><a href="">content6</a></b></td>
                </tr>
            </table>
        </div>
    </div>
</p>

其中 XXXX 是随机生成的数字。

我拥有加载 HTML 文档的所有代码。

我想从上面的代码中获取 content1 和 content2 以及不同的查询 content4。

【问题讨论】:

    标签: c# .net html html-agility-pack


    【解决方案1】:
    var doc = new HtmlDocument();
    doc.Load("test.htm");
    var res = doc.DocumentNode.SelectSingleNode("//div[@class='myclass1']");
    var firstDiv = res.SelectSingleNode("div");
    var content1 = firstDiv.ChildNodes[0].InnerText.Trim();
    var content2 = firstDiv.ChildNodes[2].InnerText.Trim();
    var content4 = res.SelectSingleNode(".//div[@class='myclass2']")
                      .SelectSingleNode(".//td[@align='left']/b/a")
                      .InnerText
                      .Trim();
    

    更新:

    如果您有多个具有给定类的 div,并且想要匹配每个 div 的内容,您可以这样做:

    var doc = new HtmlDocument();
    doc.Load("test.htm");
    var res = doc.DocumentNode.SelectNodes("//div[@class='myclass1']");
    foreach (var item in res)
    {
        var firstDiv = item.SelectSingleNode("div");
        var content1 = firstDiv.ChildNodes[0].InnerText.Trim();
        var content2 = firstDiv.ChildNodes[2].InnerText.Trim();
        var content4 = item.SelectSingleNode(".//div[@class='myclass2']")
                           .SelectSingleNode(".//td[@align='left']/b/a")
                           .InnerText
                           .Trim();
    }
    

    【讨论】:

    • 如果我想将它添加到 foreach 语句中,我该如何修改它?因为我有几个 div 类为“myclass1”
    • @Alexander Talavari,我已经更新了我的答案来展示一个例子。
    • 由于某种原因,当我在第一个循环中运行代码时,它让我返回 content1 和 content2,但随后 var content1 = item.ChildNodes[0].InnerText.Trim();给我 content3+content4+content5+content6 字符串和 var content2 = item.ChildNodes[2].InnerText.Trim();抛出 System.ArgumentOutOfRangeExeption。另外,如何在具有内容 1 和 2 的同一个 foreach 循环中获取内容 4?因为 content4 标记了 content 1 和 content2 的内容。非常感谢您花时间回答
    • @Alexander Talavari,您的实际 HTML 是什么?它的完整版本,以便我可以重现该问题。
    • 我还更新了我的答案,以说明如何在单个循环中获取内容 1、2 和 4。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多