C# HtmlAgilityPack如何在一些标记之间提取html

C# HtmlAgilityPack如何在一些标记之间提取html,c#,html-agility-pack,C#,Html Agility Pack,我需要从一个html中提取所有段落,以及标签之间的所有文本 当解析为HtmlDocument的文本与原始文本发生更改时,此代码不起作用。样本中 some <br />text 一些文本 在 some <br>text 一些文本 es: string s=“第一段一些文本另一段在spanhellow word之间的一些文本”; HtmlAgilityPack.HtmlDocument doc=新的HtmlAgilityPack.HtmlDocument(); doc

我需要从一个html中提取所有段落,以及标签之间的所有文本

当解析为HtmlDocument的文本与原始文本发生更改时,此代码不起作用。样本中

some <br />text
一些
文本

some <br>text
一些
文本
es:

string s=“第一段

一些
文本另一段

在spanhellow word之间的一些文本

”; HtmlAgilityPack.HtmlDocument doc=新的HtmlAgilityPack.HtmlDocument(); doc.LoadHtml; var nodes=doc.DocumentNode.SelectNodes(“//p”); int lastPos=-1; foreach(节点中的HtmlAgilityPack.HtmlNode n) { 如果(最后位置>-1) { 字符串textNotInP=Doc.DocumentNode.OuterHtml.Substring(lastPos,n.StreamPosition-lastPos); 系统.诊断.调试.写线(textNotInP); } 系统诊断调试写线(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>
第一段

一些
文本 第二段

span之间的一些文本 第三段

但上面的代码返回以下内容:

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

一些
文本

span>之间的一些文本您可以使用每个

元素的
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);
}
XPath抓取所有节点(元素或文本节点):具有前面的同级
p
和后面的同级
p
,或者节点本身是
p
元素

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

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

一些
文本 另一段

span之间的一些文本 hellow词


您希望实际实现什么目标?我的意思是,当您已经使用了正确的HTML解析器时,字符串操作应该是最后一个选项。。为什么首先需要手动操作
OuterHtml
?代码片段中的示例HTML与“正确结果”和当前结果中显示的示例HTML不一致,这也让人感到困惑。我只需要p标记之间的HTML,不管怎样都是好的文本到底是什么?例如,“
firt paration
”(这是在开始标记和结束标记p之间)或“
some
text
”(这是在两个p元素之间)?你说的“p标签之间”是指哪一个?我需要extrace all html包含两个段落 一些html

此html需要提取一些html

好的,但我也需要提取html不包含在

在实际html中是否有父元素?如果选择父元素并输出其
InnerHtml
,该怎么办?我猜您希望获得第一个
和最后一个
元素之间的所有内容。检查我的最新答案。
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>