如何从C#中的网页获取所有显示文本

时间:2013-10-26 08:22:13

标签: c# html

您好我正在使用C#编写数据抓取应用程序。

实际上我想获取所有的显示文本而不是html标签。

这是我的代码

HtmlWeb web  = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.
   Load(@"http://dawateislami.net/books/bookslibrary.do#!section:bookDetail_521.tr");
string str =  doc.DocumentNode.InnerText;

这个内部html也会返回一些标签和脚本,但我想只获取用户可见的显示文本。 请帮我。 感谢

3 个答案:

答案 0 :(得分:2)

[我相信这会解决你的问题] [1]

方法1 - 在内存剪切和粘贴中

使用WebBrowser控件对象处理网页,然后从控件中复制文本...

使用以下代码下载网页: 折叠|复制代码

//Create the WebBrowser control
WebBrowser wb = new WebBrowser();
//Add a new event to process document when download is completed   
wb.DocumentCompleted +=
    new WebBrowserDocumentCompletedEventHandler(DisplayText);
//Download the webpage
wb.Url = urlPath;

使用以下事件代码处理下载的网页文本: 折叠|复制代码

private void DisplayText(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender;
wb.Document.ExecCommand(“SelectAll”, false, null);
wb.Document.ExecCommand(“Copy”, false, null);
textResultsBox.Text = CleanText(Clipboard.GetText());
}

方法2 - 在内存选择对象

这是处理下载的网页文本的第二种方法。它似乎需要更长的时间(非常小的差异)。但是,它避免使用剪贴板和与之相关的限制。 折叠|复制代码

private void DisplayText(object sender, WebBrowserDocumentCompletedEventArgs e)
{   //Create the WebBrowser control and IHTMLDocument2
WebBrowser wb = (WebBrowser)sender;
IHTMLDocument2 htmlDocument =
wb.Document.DomDocument as IHTMLDocument2;
//Select all the text on the page and create a selection object
wb.Document.ExecCommand(“SelectAll”, false, null);
IHTMLSelectionObject currentSelection = htmlDocument.selection;
//Create a text range and send the range’s text to your text box
IHTMLTxtRange range = currentSelection.createRange() as IHTMLTxtRange
textResultsBox.Text = range.text;
}

方法3 - 优雅,简单,较慢的XmlDocument方法

一位好朋友和我分享了这个例子。我是一个简单的粉丝,这个例子赢得了简单的比赛。遗憾的是,与其他两种方法相比,这种方法非常缓慢。

XmlDocument对象将只使用3行简单的代码加载/处理HTML文件: 折叠|复制代码

XmlDocument document = new XmlDocument();
document.Load(“www.yourwebsite.com”);
string allText = document.InnerText;

你有它!三种简单的方法来从网页中仅显示显示的文本而不涉及外部“包”。 封装

答案 1 :(得分:0)

删除javascript和css:

foreach(var script in doc.DocumentNode.Descendants("script").ToArray())
    script.Remove();
foreach(var style in doc.DocumentNode.Descendants("style").ToArray())
    style.Remove();

删除评论(未经测试):

foreach(var comment in doc.DocumentNode.Descendants("//comment()").ToArray())
    comment.Remove()

答案 2 :(得分:0)

要从字符串中删除所有html标记,您可以使用:

String output = inputString.replaceAll("<[^>]*>", "");

删除特定标记:

String output = inputString.replaceAll("(?i)<td[^>]*>", "");

希望有所帮助:)