HtmlAgilityPack wie man HTML zwischen einigen Tags extrahiert

c# html-agility-pack

Frage

Ich muss den gesamten Absatz aus einem HTML-Code extrahieren und auch den gesamten Text zwischen diesen Tags.

Dieser Code funktioniert nicht, wenn der in HtmlDocument analysierte Text von dem ursprünglichen Text geändert wird. In der Probe

some <br />text

wird geändert in

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;
}

das richtige Ergebnis wäre:

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

aber der Code oben gibt das zurück:

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

Der Grund dafür ist, dass steamPosition die Knotenposition zurückgibt, die sich auf den ursprünglichen Text bezieht, und nicht die, die in htmlDocument parsered wird.

Gibt es eine Möglichkeit, die Position eines Knotens im Zusammenhang mit dem geparsten HTML zurückzugeben?

Akzeptierte Antwort

Sie können die OuterHtml Eigenschaft jedes <p> -Elements verwenden, um den gewünschten HTML- OuterHtml zu erhalten:

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);
}

Ausgabe :

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

Oder wenn Sie beabsichtigen, alles zwischen den ersten <p> und den letzten <p> -Elementen inklusive zu bekommen, können Sie den folgenden XPath verwenden:

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

Der XPath greift auf alle Knoten (entweder Element- oder Textknoten) zu, die folgendes haben: vorausgehende Geschwister p und folgende Geschwister p , oder der Knoten selbst ist ein p Element.

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

Ausgabe :

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum