HtmlAgilityPack如何在某些標籤之間提取html

c# html-agility-pack

我需要從一個html中提取所有段落以及該標記之間的所有文本。

當解析為HtmlDocument的文本從原始文本中更改時,此代碼不起作用。在樣本中

some <br />text

改變了

some <br>text

ES:

string s = "<p>firt paragraph</p>some <br />text<p>another paragraph</p><span>some text between span</span><p>hellow word</p>";
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(s);
var nodes = doc.DocumentNode.SelectNodes("//p");
int lastPos = -1;
foreach (HtmlAgilityPack.HtmlNode n in nodes)
{
  if (lastPos > -1)
  {
      string textNotInP = Doc.DocumentNode.OuterHtml.Substring(lastPos, n.StreamPosition - lastPos);
                System.Diagnostics.Debug.WriteLine(textNotInP);
 }
 System.Diagnostics.Debug.WriteLine(n.OuterHtml);
 lastPos = n.StreamPosition + n.OuterHtml.Length;
}

正確的結果是:

<p>firt paragraph</p>
some <br>text
<p>second paragraph</p>
<span>some text between span</span>
<p>third paragraph</p>

但上面的代碼返回:

<p>firt paragraph</p>
some <br>text<p
<p>second paragraph</p>
pan>some text between span</span><p
<p>third paragraph</p>

原因是steamPosition返回與原始文本相關的節點位置,而不是在htmlDocument中解析的那個。

有沒有辦法返回與解析的html相關的一個節點的位置?

一般承認的答案

您可以使用每個<p>元素的OuterHtml屬性來獲取所需的HTML:

string s = "<p>firt paragraph</p>some <br />text<p>another paragraph</p><span>some text between span</span><p>hellow word</p>";
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(s);
var nodes = doc.DocumentNode.SelectNodes("//p");
foreach (var item in nodes)
{
    Console.WriteLine(item.OuterHtml);
}

輸出:

<p>firt paragraph</p>
<p>another paragraph</p>
<p>hellow word</p>

或者,如果您想在第一個<p>和最後一個<p>元素之間獲取所有內容,則可以使用以下XPath:

var query = "//node()[preceding-sibling::p or self::p][following-sibling::p or self::p]";

XPath獲取所有節點(元素或文本節點):具有前一個兄弟p和後一個兄弟p ,或者節點本身是一個p元素。

var nodes = doc.DocumentNode.SelectNodes(query);
foreach (var item in nodes)
{
    Console.WriteLine(item.OuterHtml);
}

輸出:

<p>firt paragraph</p>
some
<br />
text
<p>another paragraph</p>
<span>some text between span</span>
<p>hellow word</p>


Related

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