蛙蛙池塘  
人生价值的最好体现就是做好本职工作...
公告
  • 残荷听雨,梨花飞雪,落英缤纷时节。晓来谁染枫林醉?点点都是离人泪
    活着,就是快乐!自信,就是美丽! 有人爱,就是幸福。
    春天来了
    但愿野百合也有春天

    第三季度的计划



    木了
    晚上一个人看会儿《读者乡土人文版》,听会儿广播挺不错的,想起了三年前在石家庄没电脑的日子,时光飞逝呀,现在笔记本都用上了,以前从没想过,确实得知足常乐。
日历
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 248
  • 文章 - 2
  • 评论 - 2319
  • 引用 - 75

导航

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我参与的团队

我的标签

随笔分类

随笔档案

相册

朋友

积分与排名

  • 积分 - 540543
  • 排名 - 49

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

 

摘要:
上次和大家讨论了一些正文提取的细节问题,这次我把一些关键问题解决了,给大家上一下代码,并做了演示,能提取不少网站的正文了,当然在功能和代码组织上还有不少改进的地方。

思路:
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]替换成回车换行,这步也用正则。到此,正文提取完毕
主要代码:

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]");
                
float xCount = (float)(r.Matches(x).Count) / (float)x.Length;
                
float yCount = (float)(r.Matches(y).Count) / (float)y.Length;

                
int retval = xCount.CompareTo(yCount);

                
if (retval != 0)
                
{
                    
return retval;
                }

                
else
                
{
                    
return x.CompareTo(y);
                }

            }

        }

    }


    
/// <summary>
    
/// 获取一个网页源码中的标签列表,支持嵌套,一般或去div,td等容器
    
/// </summary>
    
/// <param name="input"></param>
    
/// <param name="tag"></param>
    
/// <returns></returns>

    public static List<string> GetTags(string input, string tag)
    
{
        StringReader strReader 
= new StringReader(input);
        
int lowerThanCharCounter = 0;
        
int lowerThanCharPos = 0;
        Stack
<int> tagPos = new Stack<int>();
        List
<string> taglist = new List<string>();
        
int i = 0;
        
while (true)
        
{
            
try
            
{
                
int intCharacter = strReader.Read();
                
if (intCharacter == -1break;

                
char convertedCharacter = Convert.ToChar(intCharacter);

                
if (lowerThanCharCounter > 0)
                
{
                    
if (convertedCharacter == '>')
                    
{
                        lowerThanCharCounter
--;

                        
string biaoqian = input.Substring(lowerThanCharPos, i - lowerThanCharPos + 1);
                        
if (biaoqian.StartsWith(string.Format("<{0}", tag)))
                        
{
                            tagPos.Push(lowerThanCharPos);
                        }

                        
if (biaoqian.StartsWith(string.Format("</{0}", tag)))
                        
{
                            
if (tagPos.Count < 1)
                                
continue;
                            
int tempTagPos = tagPos.Pop();
                            
string strdiv = input.Substring(tempTagPos, i - tempTagPos + 1);
                            taglist.Add(strdiv);
                        }

                    }

                }


                
if (convertedCharacter == '<')
                
{
                    lowerThanCharCounter
++;
                    lowerThanCharPos 
= i;
                }

            }

            
finally
            
{
                i
++;
            }

        }

        
return taglist;
    }


    
/// <summary>
    
/// 获取指定网页的源码,支持编码自动识别
    
/// </summary>
    
/// <param name="url"></param>
    
/// <returns></returns>

    public static string getDataFromUrl(string url)
    
{
        
string str = string.Empty;
        HttpWebRequest request 
= (HttpWebRequest)HttpWebRequest.Create(url);

        
//设置http头
        request.AllowAutoRedirect = true;
        request.AllowWriteStreamBuffering 
= true;
        request.Referer 
= "";
        request.Timeout 
= 10 * 1000;
        request.UserAgent 
= "";

        HttpWebResponse response 
= null;
        
try
        
{
            response 
= (HttpWebResponse)request.GetResponse();
            
if (response.StatusCode == HttpStatusCode.OK)
            
{
                
//根据http应答的http头来判断编码
                string characterSet = response.CharacterSet;
                Encoding encode;
                
if (characterSet != "")
                
{
                    
if (characterSet == "ISO-8859-1")
                    
{
                        characterSet 
= "gb2312";
                    }

                    encode 
= Encoding.GetEncoding(characterSet);
                }

                
else
                
{
                    encode 
= Encoding.Default;
                }


                
//声明一个内存流来保存http应答流
                Stream receiveStream = response.GetResponseStream();
                MemoryStream mStream 
= new MemoryStream();

                
byte[] bf = new byte[255];
                
int count = receiveStream.Read(bf, 0255);
                
while (count > 0)
                
{
                    mStream.Write(bf, 
0, count);
                    count 
= receiveStream.Read(bf, 0255);
                }

                receiveStream.Close();

                mStream.Seek(
0, SeekOrigin.Begin);

                
//从内存流里读取字符串
                StreamReader reader = new StreamReader(mStream, encode);
                
char[] buffer = new char[1024];
                count 
= reader.Read(buffer, 01024);
                
while (count > 0)
                
{
                    str 
+= new String(buffer, 0, count);
                    count 
= reader.Read(buffer, 01024);
                }


                
//从解析出的字符串里判断charset,如果和http应答的编码不一直
                
//那么以页面声明的为准,再次从内存流里重新读取文本
                Regex reg =
                    
new Regex(@"<meta[\s\S]+?charset=(.*)""[\s\S]+?>",
                              RegexOptions.Multiline 
| RegexOptions.IgnoreCase);
                MatchCollection mc 
= reg.Matches(str);
                
if (mc.Count > 0)
                
{
                    
string tempCharSet = mc[0].Result("$1");
                    
if (string.Compare(tempCharSet, characterSet, true!= 0)
                    
{
                        encode 
= Encoding.GetEncoding(tempCharSet);
                        str 
= string.Empty;
                        mStream.Seek(
0, SeekOrigin.Begin);
                        reader 
= new StreamReader(mStream, encode);
                        buffer 
= new char[255];
                        count 
= reader.Read(buffer, 0255);
                        
while (count > 0)
                        
{
                            str 
+= new String(buffer, 0, count);
                            count 
= reader.Read(buffer, 0255);
                        }

                    }

                }

                reader.Close();
                mStream.Close();
            }

        }

        
catch (Exception ex)
        
{
            Trace.TraceError(ex.ToString());
        }

        
finally
        
{
            
if (response != null)
                response.Close();
        }

        
return str;
    }


    
/// <summary>
    
/// 从一段网页源码中获取正文
    
/// </summary>
    
/// <param name="input"></param>
    
/// <returns></returns>

    public static string GetMainContent(string input)
    
{
        
string reg1 = @"<(p|br)[^<]*>";
        
string reg2 =
            
@"(\[([^=]*)(=[^\]]*)?\][\s\S]*?\[/\1\])|(?<lj>(?=[^\u4E00-\u9FA5\uFE30-\uFFA0,."");])<a\s+[^>]*>[^<]{2,}</a>(?=[^\u4E00-\u9FA5\uFE30-\uFFA0,."");]))|(?<Style><style[\s\S]+?/style>)|(?<select><select[\s\S]+?/select>)|(?<Script><script[\s\S]*?/script>)|(?<Explein><\!\-\-[\s\S]*?\-\->)|(?<li><li(\s+[^>]+)?>[\s\S]*?/li>)|(?<Html></?\s*[^> ]+(\s*[^=>]+?=['""]?[^""']+?['""]?)*?[^\[<]*>)|(?<Other>&[a-zA-Z]+;)|(?<Other2>\#[a-z0-9]{6})|(?<Space>\s+)|(\&\#\d+\;)";

        
//1、获取网页的所有div标签
        List<string> list = GetTags(input, "div");

        
//2、去除汉字少于200字的div
        List<string> needToRemove = new List<string>();
        
foreach (string s in list)
        
{
            Regex r 
= new Regex("[\u4e00-\u9fa5]");
            
if (r.Matches(s).Count < 300)
            
{
                needToRemove.Add(s);
            }

        }

        
foreach (string s in needToRemove)
        
{
            list.Remove(s);
        }


        
//3、把剩下的div按汉字比例多少倒序排列,
        list.Sort(CompareDinosByChineseLength);
        
if (list.Count < 1)
        
{
            
return "";
        }

        input 
= list[list.Count - 1];

        
//4、把p和br替换成特殊的占位符[p][br]
        input = new Regex(reg1, RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(input, "[$1]");

        
//5、去掉HTML标签,保留汉字
        input = new Regex(reg2, RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(input, "");

        
//6、把特殊占维护替换成回车和换行
        input = new Regex("\\[p]", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(input, "\r\n  ");
        input 
= new Regex("\\[br]", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(input, "\r\n");
        
return input;
    }

}



测试:
我测试了几个大网站的页面,效果还可以
新浪博客
http://blog.sina.com.cn/s/blog_4f168ead01008tk3.html
博客园
http://www.cnblogs.com/shinn/archive/2008/04/12/1147473.html
CSDN博客
http://blog.csdn.net/testing_is_believing/archive/2008/04/09/2271195.aspx
新浪新闻
http://news.sina.com.cn/c/2008-04-12/175315343555.shtml
百度空间(提取的比较干净)
http://hi.baidu.com/freepole/blog/item/de8edd09e23f9b87d0581bd8.html
qq新闻(把后面的推荐视频也提取了)
http://finance.qq.com/a/20080412/001783.htm
搜狐新闻
http://news.sohu.com/20080411/n256238690.shtml
新华网新闻
http://news.xinhuanet.com/newscenter/2008-04/12/content_7966283.htm
网易新闻
http://news.163.com/08/0412/00/499PUOR00001124J.html
网易博客
http://cantonsir.blog.163.com/blog/static/84402712008310631830/?fromAmusement
CSDN新闻
http://news.csdn.net/n/20080411/115109.html

源码下载:
http://files.cnblogs.com/onlytiancai/GetMainContent.zip

改进:
1、排序之前把超链接文字数量和汉字数量比例超过百分之50的div去掉,因为这些都是相关链接或者文字广告
2、把title分词(去除停止词,只保留名词和动词)后和剩下的几个div做比较,把内容里没有title分词的文字块去掉,因为正文内容一般都多多少少包含标题里的词。当然如果正文里用的都是比喻,拟人等手法,那也没办法了
3、代码强壮性增强,有些地方可能会抛异常。
4、好多论坛的地址都是一个Frame,所以获取源码的时候得不到目标页面的源码,这个其实可以加一个智能判断,580k就支持。
5、最后提取出的结果有时候不太赶紧,其实可以把最后剩下的文本块再做详细分析,去除掉无关文本。
6、目前只支持div布局的网站,还要加上支持表格布局的网站比如百度贴吧,达到自动检测。


编辑:

1、以上代码有个bug,就是不支持大写的DIV标签,在gettag函数里比较标签的时候用忽略大小写的startwith就尅了,如下

if (biaoqian.StartsWith(string.Format("</{0}", tag),StringComparison.OrdinalIgnoreCase))

2、发现一个bug,对于博客园的帖子,如果正文贴的代码太多,就无法提取了,因为代码都不是汉字,导致正文区域的评分太低,所以没被识别成正文,所以我的算法比较适合于提取中文正文。

Tag标签: 正文提取
posted on 2008-04-12 21:36 蛙蛙池塘 阅读(4108) 评论(56)  编辑 收藏 网摘
评论:
  • #1楼  海洋       Posted @ 2008-04-12 21:40
    救星啊,正需要这个   回复  引用  查看    

  • #2楼[楼主]  蛙蛙池塘       Posted @ 2008-04-12 21:42
    忘了用#region把代码折叠一下,大家凑合看吧   回复  引用  查看    

  • #3楼  nicexw[未注册用户] Posted @ 2008-04-12 21:43
    先收藏了!呵呵!   回复  引用    

  • #4楼[楼主]  蛙蛙池塘       Posted @ 2008-04-12 21:55
    @海洋
    这个准确率还很不高,建议自己修改提高准确率
      回复  引用  查看    

  • #5楼  侯垒       Posted @ 2008-04-12 22:12
    支持.   回复  引用  查看    

  • #6楼  Justin       Posted @ 2008-04-12 22:38
    mark!有空再学习一下,谢谢lz   回复  引用  查看    

  • #7楼  asp.net CMS[未注册用户] Posted @ 2008-04-12 23:01
    你也在研究这个啊

    我用的递归,准确率80%左右了
      回复  引用    

  • #8楼[楼主]  蛙蛙池塘       Posted @ 2008-04-12 23:18
    @asp.net CMS
    分享下思路哦,呵呵呵。牛B的正文提取都是基于视觉和利用语义提取的。
      回复  引用  查看    

  • #9楼[楼主]  蛙蛙池塘       Posted @ 2008-04-12 23:42
    基于视觉的算法,大家有兴趣可以查看以下链接
    http://blog.csdn.net/tingya/archive/2006/02/18/601836.aspx" target="_new">http://blog.csdn.net/tingya/archive/2006/02/18/601836.aspx
      回复  引用  查看    

  • #10楼  怪怪       Posted @ 2008-04-13 00:10
    你链接里那个算法, 还没等它成熟, 估计就用不上了...。 我觉得自己做的, 有一定正确率, 就可以了。 最后那20%, 每进哪怕0.1毫米, 对于普通开发者或者组织来说, 代价都太大。

    说到基于视觉,对于静态页面, 如果硬件够强, 我推荐为服务器应用优化一个HTML渲染引擎, 先生成图片, 然后用现成的排版分析算法去做。 也就是分成三个个阶段的一个流水线: 1. 大规模生成图片的服务器(或集群下同) 2. 版面分析 3. 反过来求文本块对应的内容, 或者直接文字识别(看那个开销大)。

    不过对于JS控制的版式, 还是不好确定。 说实在的, 提取文本块, 现阶段人工参与的效率最高。 流程如下: 1. 机器分析相同或相似结构的文档 2. 查询有无备案 3. 对无备案的, 要求人工参与, 之后备案 4 根据备案分析

    不过如果是搜索引擎, 这个效率不知道能不能乐观, 如果800块钱一个月(中国或者非洲?在互联网上发包就可以), 加上其它支出, 不知道大公司们负担的起不。

    从某种意义上来说这完全是浪费能量, 还是向着语义网迈进比较靠谱。 不过语义网发展到一定阶段, 任何现阶段靠扒网页的皮的应用, 包括现在这种形式的搜索引擎, 都得玩完。
      回复  引用  查看    

  • #11楼[楼主]  蛙蛙池塘       Posted @ 2008-04-13 00:22
    比较多个网页的相似性,然后生成模板也是一种常用的做法,现在好多公司都是用模板来精确提取正文的,king以前写过一点正文提取的帖子,如下
    http://blog.likeshow.net/article.asp?id=60" target="_new">http://blog.likeshow.net/article.asp?id=60
      回复  引用  查看    

  • #12楼  怪怪       Posted @ 2008-04-13 06:30
    就是这个意思 :) 不过我感觉, 人工参与的办法, 关键不在于算法, 而在于投入与流程~

    对了, 你说的不规范的HTML问题, 如果找不到合适的HTML开源项目, 用SGML的也可以规整一下, 加上dtd作为根据; 然后就可以转为XML处理了。 正则的话, 可以根据需要优化的地方就受限制, 万一需求复杂了也不灵活; 纯自己写, 这个轮子造起来也不少费劲。
      回复  引用  查看    

  • #13楼[楼主]  蛙蛙池塘       Posted @ 2008-04-13 09:42
    @怪怪
    确实,腾讯不是招了好几千人工搜索大军吗,呵呵。

    SGML之前理解的只是概念,没啥实用价值,没具体学习过。正则有时候确实不太好用,你无法控制它的字符扫描过程,只能按它的规则去拼规则。
      回复  引用  查看    

  • #14楼  overred       Posted @ 2008-04-13 10:55
    不错,以前研究过。。。。
    1.增加让它学习的功能,跟一些验证码识别组件似的
    2.让用户可以输入一个阈值,来提取
    3.高级:神经网络结构裁剪和训练算法以及优化的规则提取算法

    这有一篇不错的文章:
    英文原文:http://ai-depot.com/articles/the-easy-way-to-extract-useful-text-from-arbitrary-html

    译文:http://blog.csdn.net/lanphaday/archive/2007/08/13/1741185.aspx
    蛙蛙 想你Fetionmm了 哈哈
      回复  引用  查看    

  • #15楼  随风流月       Posted @ 2008-04-13 12:34
    @怪怪
    本来说我手上已经有一个方法了,并且也相当成熟;但是鉴于某些原因,我还是不发出来为妙。
      回复  引用  查看    

  • #16楼  kuafoo       Posted @ 2008-04-13 14:31
    不错   回复  引用  查看    

  • #17楼[楼主]  蛙蛙池塘       Posted @ 2008-04-13 16:04
    @overred
    1、学习的功能应该不好引入,这就是一个简单的算法,要是引入贝叶斯之类的学习算法感觉有点儿太强了。
    2、我这个算法倒是确实有几个阈值可以设置。
    推荐的文章8错,呵呵,我先看看,搜索引擎方面的数学和算法太重要了,可惜我看不懂几个。
    @随风流月
    啥方法呀,说说原理总可以把。
      回复  引用  查看    

  • #18楼[楼主]  蛙蛙池塘       Posted @ 2008-04-13 16:23
    @overred
    那帖子看过了,讲的不错,呵呵。思路挺好,其实我也想过计算文本和所有字节的比例来排序,但不知道效果如何,那样的话我的正文提取就支持中英文混合正文了。
    后面讲的机器学习算法和神经网络算法,不知道c#有没有开源项目,还不太了解,呵呵。

    另外向大家宣传一下俺的fetionmm网,欢迎大家来注册哦,网址如下
    www.fetionmm.com
      回复  引用  查看    

  • #19楼  overred       Posted @ 2008-04-13 16:45
    @蛙蛙池塘
    不清楚哈
    “计算文本和所有字节的比例来排”我见人写过。。。效果还不错

    csdn的xx剪影手应该是模板
      回复  引用  查看    

  • #20楼  Ryan Yu       Posted @ 2008-04-13 23:34
    :)感谢楼主分享   回复  引用  查看    

  • #21楼  把大海藏到心里       Posted @ 2008-04-13 23:37
    学习!   回复  引用  查看    

  • #22楼  怪怪       Posted @ 2008-04-14 08:22
    @overred
    这个方法好, 性价比真高。 唉, 跟人家比我简直就是笨蛋了。

    @蛙蛙池塘
    哦? 什么原因? 我对八卦最感兴趣哈哈 = D
      回复  引用  查看    

  • #23楼[楼主]  蛙蛙池塘       Posted @ 2008-04-14 09:43
    --引用--------------------------------------------------
    怪怪: @overred
    这个方法好, 性价比真高。 唉, 跟人家比我简直就是笨蛋了。

    @蛙蛙池塘
    哦? 什么原因? 我对八卦最感兴趣哈哈 = D
    --------------------------------------------------------
    overred的那个算法说的简单,但是c#有人测试过吗?

    关于腾讯招募搜索大军参考以下链接
    http://rss.xinhuanet.com/newsc/internet/2008-04/10/content_7953648.htm" target="_new">http://rss.xinhuanet.com/newsc/internet/2008-04/10/content_7953648.htm
      回复  引用  查看    

  • #24楼  s33[未注册用户] Posted @ 2008-04-14 10:06
    有没想过,把获取到的HTML先用IE解析成我们看到的页面(就是IE里显示的页面),然后再做分析。   回复  引用    

  • #25楼  s33[未注册用户] Posted @ 2008-04-14 10:09
    以前写过几个,都不是通用的,都是针对某个网站抓取,这样针对性强也不会出问题(直接HTML代码分析后抓取的)

    一直想找个好的HTML解析库,把HTML源码先解析成IE里显示的内容,然后分析所占区域大小,再进一步抓取。
      回复  引用    

  • #26楼  黯然消魂       Posted @ 2008-04-14 10:32
    强人,支持你一个,   回复  引用  查看    

  • #27楼  overred       Posted @ 2008-04-14 10:45
    --引用--------------------------------------------------
    蛙蛙池塘: --引用--------------------------------------------------
    怪怪: @overred
    这个方法好, 性价比真高。 唉, 跟人家比我简直就是笨蛋了。

    @蛙蛙池塘
    哦? 什么原因? 我对八卦最感兴趣哈哈 = D
    --------------------------------------------------------
    overred的那个算法说的简单,但是c#有人测试过吗?

    关于腾讯招募搜索大军参考以下链接
    <a href="http://rss.xinhuanet.com/newsc/internet/2008-04/10/content_7953648.htm" target="_new">http://rss.xinhuanet.com/newsc/internet/2008-04/10/content_7953648.htm</a>
    --------------------------------------------------------
    那个算法啊?
      回复  引用  查看    

  • #28楼[楼主]  蛙蛙池塘       Posted @ 2008-04-14 11:42
    @overred
    你的那篇帖子需要用到机器学习和神经网络算法,c#里有现成的吗?就是说那个例子是python写的,有人把示例移植到c#并做过测试吗?
    @s33
    用webbrowser就OK,直接设置documenthtml
      回复  引用  查看    

  • #29楼  overred       Posted @ 2008-04-14 12:12
    @蛙蛙池塘
    没了
    python也是调人家的库
    。。。

    蛙蛙写吧
      回复  引用  查看    

  • #30楼  jujusharp       Posted @ 2008-04-14 18:06
    晕,用工具提取你这篇文章,结果把下面的一篇回复结果提取了   回复  引用  查看    

  • #31楼[楼主]  蛙蛙池塘       Posted @ 2008-04-14 21:11
    @jujusharp
    呵呵,我的算法是提取中文新闻或者博客正文的,这篇帖子贴了大量的英文代码,所以提取不正确了,要想提取这篇帖子,自己改改吧,呵呵。
      回复  引用  查看    

  • #32楼  1111111111[未注册用户] Posted @ 2008-06-07 20:35
    编码自动识别的地方还是不够完美。 遇到了乱码。

    有什么好的解决方法?
      回复  引用    

  • #33楼  静[未注册用户] Posted @ 2008-11-26 10:12
    你好,我是菜鸟,想编译一下你的这个代码,但是不知道怎么做,怎么建立一个工程啊。是建立什么工程,是控制台呢还是web service呢   回复  引用    

  • #34楼[楼主]  蛙蛙池塘       Posted @ 2008-11-26 10:16
    @静
    直接用vs打开就行,是个winform程序
      回复  引用  查看    

  • #35楼  静[未注册用户] Posted @ 2008-11-27 09:01
    @蛙蛙池塘
    你好,我已经编译通过了,但是这个类里面的函数不知道怎么去用,传进去的参数也不知道是什么,呵呵。。可以把你的工程发我一下吗?我的emil:yejing97@gmail.com.
      回复  引用    

  • #36楼[楼主]  蛙蛙池塘       Posted @ 2008-11-27 12:29
    @静
    很简单呀,我帖子里没说吗?
      回复  引用  查看    

  • #37楼  静[未注册用户] Posted @ 2008-11-30 16:05
    3、把剩下的div按汉字比例多少倒序排列,
    list.Sort(CompareDinosByChineseLength);
    请问这里的CompareDinosByChineseLength函数是有参数的啊,为什么参数都不传的啊
      回复  引用    

  • #38楼[楼主]  蛙蛙池塘       Posted @ 2008-11-30 21:05
    @静
    那是个委托吧,传名字就行吧。
      回复  引用  查看    

  • #39楼  no123333333[未注册用户] Posted @ 2008-12-29 18:33
    大写的div 不难吧 获得的内容全部转小写在处理啊   回复  引用    

  • #40楼  忘记我[未注册用户] Posted @ 2009-01-14 23:52
    楼主的思路是比较的简单,如果对论坛页面怎么处理,那里面有多个文本块呢。用大小来比较,有些页面的内容比如里面有多个表格,都是有效文本,怎么处理呢?

    看看这个在线正文提取,一起研究下哈。
    http://61.128.196.27/txt/

      回复  引用    

  • #41楼[楼主]  蛙蛙池塘       Posted @ 2009-01-15 11:12
    你的正文提取很强悍呀!!!
    我的想改进一下支持td布局呢想,别的算法不太清楚呀,算法会很复杂吧,给指点指点撒。
      回复  引用  查看    

  • #42楼[楼主]  蛙蛙池塘       Posted @ 2009-01-15 11:16
    @忘记我
    你的确实很强大,呵呵,我试了好几个都可以。
      回复  引用  查看    

  • #43楼  单位的得分份儿饭[未注册用户] Posted @ 2009-03-02 13:09
    请教楼主:
    如果是动态的页面如何抓取啊?
    需要判断加载完成么?
    我试了一下,好像都是乱码的啊
      回复  引用    

  • #44楼  思想哦哦不耐烦[未注册用户] Posted @ 2009-03-02 14:57
    借宝地问问:
    我在抓取51job的登陆页面时,即便把登陆后的URL给进去,也抓不到东西啊。
    难道动态或者和数据库打交道的页面就不行了吗
    99
      回复  引用    

  • #45楼[楼主]  蛙蛙池塘       Posted @ 2009-03-02 17:35
    @思想哦哦不耐烦
    该算法一般提取有明显正文的新闻详细页面。
      回复  引用  查看    

  • #46楼  波波哈哈[未注册用户] Posted @ 2009-04-27 10:51
    要是能提取英文就更好了   回复  引用    

  • #47楼  大禹治水[未注册用户] Posted @ 2009-04-28 15:54
    string reg2 =
    @"(\[([^=]*)(=[^\]]*)?\][\s\S]*?\[/\1\])|(?<lj>(?=[^\u4E00-\u9FA5\uFE30-\uFFA0,."");])<a\s+[^>]*>[^<]{2,}</a>(?=[^\u4E00-\u9FA5\uFE30-\uFFA0,."");]))|(?<Style><style[\s\S]+?/style>)|(?<select><select[\s\S]+?/select>)|(?<Script><script[\s\S]*?/script>)|(?<Explein><\!\-\-[\s\S]*?\-\->)|(?<li><li(\s+[^>]+)?>[\s\S]*?/li>)|(?<Html></?\s*[^> ]+(\s*[^=>]+?=['""]?[^""']+?['""]?)*?[^\[<]*>)|(?<Other>&[a-zA-Z]+;)|(?<Other2>\#[a-z0-9]{6})|(?<Space>\s+)|(\&\#\d+\;)";
    请问这个提取网页中所有HTML标签的正则表达式能详细介绍下吗?感觉看不懂
      回复  引用    

  • #48楼  zxw[未注册用户] Posted @ 2009-05-02 01:16
    请博主联系我QQ364862701,我愿意购买你一个好用的代码。   回复  引用    

  • #49楼[楼主]  蛙蛙池塘       Posted @ 2009-05-03 23:33
    @波波哈哈
    英文我也想过,没想出来,呵呵,英文应该有别的招儿吧。
    @大禹治水
    我也从网上找到,你问king总去
    @zxw
    呵呵,开玩笑呢吧,我这个后来改进过,始终不是很满意,达不到能卖的程度,你去找死小风行买一个吧,他专门研究这个的。
      回复  引用  查看    

  • #50楼  大禹治水[未注册用户] Posted @ 2009-05-13 10:46
    很佩服楼主。代码规范注释都很清晰。我是大四学生。也在做网页解析正文提取方面的工作。等我毕业后。我也会像楼主学习。把算法公布。不过我做的是专门网站。只对菜鸟有一定的意义。   回复  引用    

  • #51楼[楼主]  蛙蛙池塘       Posted @ 2009-05-14 12:30
    @大禹治水
    呵呵,有分享精神就行。
      回复  引用  查看    

  • #52楼  大禹治水[未注册用户] Posted @ 2009-05-20 19:20
    楼主现在是在工作还是读研?是这样的,我在毕设中查阅过一些论文。觉得楼主这个算法完全可以发表。我目前在设计针对静态新闻网页的网页解析器。用楼主的用法精度非常高。   回复  引用    

  • #53楼[楼主]  蛙蛙池塘       Posted @ 2009-05-27 10:40
    @大禹治水
    发表啥呀,我瞎弄的,我工作了。
      回复  引用  查看    

  • #54楼  tj[未注册用户] Posted @ 2009-06-28 09:22
    高人!强!太崇拜你了   回复  引用    

  • #55楼[楼主]  蛙蛙池塘       Posted @ 2009-06-29 13:09
    @tj
    :)
      回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1150687





相关文章:

相关链接:
 
Copyright © 蛙蛙池塘 Powered by: 博客园 模板提供:沪江博客