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?
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>