HtmlAgilityPack並選擇節點和子節點

c# html-agility-pack xpath

希望有人可以幫助我。

假設我有一個包含多個div的html文檔,如下例所示:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

我正在使用HtmlAgilityPack來獲取html文檔。我需要知道的是我如何獲得每個“search_hit”-div的跨度?

我的第一個想法是這樣的:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

每個div應該是包含spans作為屬性的對象。 I. e。

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

然後填寫此清單:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

但我正在使用的XPATH並沒有在子節點中進行搜索,因為它應該這樣做。它接縫一遍又一遍地搜索整個文檔。

我的意思是我已經讓它以這種方式工作,我只是得到整個頁面的跨度。但後來我在跨度和div之間沒有任何關係。意思是:我不知道哪個跨度與哪個div有關。

有人知道解決方案嗎?我已經玩了很多,我現在完全糊塗了:)

任何幫助表示讚賞!

一般承認的答案

以下適用於我。重要的是正如BeniBela指出在第二次調用“SelectNodes”時添加一個點。

List<Record> lstRecords=new List<Record>();
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
  Record record=new Record();
  foreach (HtmlNode node2 in node.SelectNodes(".//span[@prop]"))
  {
    string attributeValue = node2.GetAttributeValue("prop", "");
    if (attributeValue == "name")
    {
      record.Name = node2.InnerText;
    }
    else if (attributeValue == "company")
    {
      record.company = node2.InnerText;
    }
    else if (attributeValue == "street")
    {
      record.street = node2.InnerText;
    }
  }
  lstRecords.Add(record);
}

熱門答案

如果使用// ,則從文檔開始搜索。

使用.//從當前節點搜索所有內容

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))

或者完全刪除前綴以搜索直接子項:

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因