c#实现网页正文抓取

时间:2021-07-22 01:46:08

需要记住的,随笔记一下

1、抓取远程网页源码,这里要实现自动判断网页编码,否则有可能抓到乱码。我是先看应答的 http头的chareset,一般这个很准,但像csdn的新闻比较变态http应答的头里的chareset和网页的meta里声明的 chareset不一致,所以我手工加了一下判断,如果不一致再在内存流里用网页声明的编码读取一遍源码 2、把网页分割成几大块。试用了一下tidy的.net包装及HtmlParse的.net版本,都不太好用。于是我自己写了个算法,可以把网页里的div块,td块等都提取出来,支持嵌套的情况。一般只提取div的文字块儿就行了。 3、把汉字少于200的文本块去了,一般少于200字的文本块不会是正文,即便是正文,一般来说也不会有太多的价值,我直接去掉。 4、 因为div支持嵌套,所以剩下的文本块,有可能是重复的,一个是另一个的父节点,所以要把最里层的文本块找出来,最里层的文本块肯定是汉字最多的,而其它 文本最少的,所以要计算出剩余文本块中汉字占所有字符比例最高的文本块,基本上它就是正文的文本块了。当然有的网页正文里也可能还有div的文本块,这时 候可能会判断错误,,但只要正文嵌套的Div文本块的汉字少于200字,我的算法还是能准确提取正文文本块的。这一步我用写了一个自定义的方法传递给 List的Sort方法。 5、把<p><br>等标签替换成特殊占位符[p][br]等,因为最终的正文需要保留段落和回车换行等格式。这一步用正则实现。 6、把最后剩下的文本块的html标签去掉,我用正则过滤的。 7、把[p]替换成回车换行加俩空格,把[br]替换成回车换行,这步也用正则。到此,正文提取完毕

主要代码:

[csharp]  

 

c#实现网页正文抓取

<span style="font-size:18px;">public class GetMainContentHelper  

{  

    ///<summary>  

    /// 判断两段儿文本里哪个中文占的比例高  

    ///</summary>  

    ///<param name="x"></param>  

    ///<param name="y"></param>  

    ///<returns></returns>  

    public static int CompareDinosByChineseLength(string x, string y)  

    {  

        if (x == null)  

        {  

            if (y == null)  

            {  

                return 0;  

            }  

            else  

            {  

                return -1;  

            }  

        }  

        else  

        {  

            if (y == null)  

            {  

                return 1;  

            }  

            else  

            {  

                Regex r = new Regex("[\u4e00-\u9fa5]");