如何從html中提取文本

c# html-agility-pack

我需要提取html的<body>中存在的所有文本。示例Html輸入: -

<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src="abc.jpg"/>
    </body>
</html>

輸出應該是: -

<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src="abc.jpg"/>
    </body>
</html>

我只想將HtmlAgility用於此目的。請不要正則表達式。

我知道如何加載HtmlDocument,然後使用像'// body'這樣的xquery,我們可以獲取正文內容。但是如何刪除輸出中顯示的html?

提前致謝 :)

一般承認的答案

你可以使用body的InnerText

string html = @"
<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src=""abc.jpg""/>
    </body>
</html>";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.SelectSingleNode("//body").InnerText;

接下來,您可能想要折疊空格和新行:

string html = @"
<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src=""abc.jpg""/>
    </body>
</html>";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.SelectSingleNode("//body").InnerText;

但請注意,雖然它在這種情況下工作,但是標記如hello<br>worldhello<i>world</i>將由InnerText轉換為helloworld - 刪除標記。很難解決這個問題,因為顯示是由CSS決定的,而不僅僅是標記。


熱門答案

如何使用XPath表達式'//body//text()'來選擇所有文本節點?




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