HtmlAgilityPack从div

时间:2015-06-21 02:57:42

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

我正在尝试使用div列表中的HtmlAgilityPack子元素。最父的Div是 // div [@class ='cell in-area-cell-cell mid-cell'] ,如果我只是遍历列表,我可以显示来自每个父级的所有子内容

但我不想显示所有内容,我想从每个孩子中选择某些div,p和a,但下面的代码只给出了第一个 // a的列表[@类= '列出名'] 即可。它给了我正确数量的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);
}

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

1 个答案:

答案 0 :(得分:1)

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

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

注意XPath开头的.表示XPath是相对于当前上下文元素SelectSingleNode()方法调用node变量将node作为当前上下文元素。否则,您将始终在每次迭代中反复获得相同的元素。