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
作为 当前上下文元素 。否则,每次迭代都会一遍又一遍地得到相同的元素。
我正在尝试使用 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
作为 当前上下文元素 。否则,每次迭代都会一遍又一遍地得到相同的元素。