HtmlAgilityPack Select 个 div 列表中的单个元素

HtmlAgilityPack Select individual elements from a list of divs

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

但我不想显示所有内容,我想从每个children中挑选某些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);
}

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

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

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

注意 XPath 开头的 .,它表示 XPath 是相对于 当前上下文元素 ,并且 SelectSingleNode() 方法调用 node 变量使 node 作为 当前上下文元素 。否则,每次迭代都会一遍又一遍地得到相同的元素。