【问题标题】:HtmlAgilityPack Select individual elements from a list of divsHtmlAgilityPack 从 div 列表中选择单个元素
【发布时间】:2015-06-21 02:57:42
【问题描述】:

我正在尝试使用 div 列表中的 HtmlAgilityPack 子元素进行抓取。最父级的 Div 是 //div[@class='cell in-area-cell middle-cell'] 如果我简单地遍历列表,我可以显示每个父级的所有子内容.

但我不想显示所有内容,我想从每个孩子中挑选某些 div、p 和 a,但下面的代码只给了我第一个 //a 的列表[@class='listing-name']。它给了我正确数量的 lstRecords,但它们都具有相同的值。

这是我的代码:

型号:

public class TempSearch
{
    public string listing_name { get; set; }
}

查看:

@model List<tempsearch.Models.TempSearch>

@foreach (var ps in Model)
{
    <h4>@Html.Raw(ps.listing_name)</h4>
}

控制:

public ActionResult TempSearch()
{
    string html = Server.MapPath("~/Content/tempsearch.html");

    HtmlWeb web = new HtmlWeb();
    HtmlDocument document = web.Load(html);

    List<TempSearch> lstRecords = new List<TempSearch>();

    foreach (HtmlNode node in document.DocumentNode.SelectNodes("//div[@class='cell in-area-cell middle-cell']"))
    {
        TempSearch tempSearch = new TempSearch();

        HtmlNode node2 = document.DocumentNode.SelectSingleNode("//a[@class='listing-name']");

        tempSearch.listing_name += node2.InnerHtml.Trim();
        lstRecords.Add(tempSearch);

    }
    return View(lstRecords);
}

我猜这与我填充列表的方式有关?

【问题讨论】:

    标签: asp.net-mvc html-agility-pack


    【解决方案1】:

    您想使用相对于node 变量当前引用的元素的 XPath,如下所示:

    HtmlNode node2 = node.SelectSingleNode(".//a[@class='listing-name']");
    

    注意 XPath 开头的 . 表示 XPath 是相对于当前上下文元素,并且在 node 变量上调用 SelectSingleNode() 方法以使 node当前上下文元素。否则,您将始终在每次迭代中一遍又一遍地获得相同的元素。

    【讨论】:

    • @Bojangles 这个答案有什么问题吗?它对你有用吗?
    • 哇!有一个 。在我的 xpath 刚刚救了我之前。浪费了很多时间来获取页面的第一个节点。当试图找出如何查询集合中的节点时,在其他任何地方都没有找到这个。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多