从HTML文件中抽取正文的简单方案 收藏
< type=text/javascript> The concept is rather simple: use information about the density of text vs. HTML code to work out if a line of text is worth outputting. (This isn’t a novel idea, but it works!) The basic process works as follows:
- Parse the HTML code and keep track of the number of bytes processed.
- Store the text output on a per-line, or per-paragraph basis.
- Associate with each text line the number of bytes of HTML required to describe it.
- Compute the text density of each line by calculating the ratio of text to bytes.
- Then decide if the line is part of the content by using a neural network.



- Density of the current line.
- 当前行的密度
- Number of HTML bytes of the line.
- 当前行的HTML字节数
- Length of output text for this line.
- 当前行的输出文本长度
- These three values for the previous line,
- 前一行的这三个值
- … and the same for the next line.
- 后一行的这三个值

原文链接:
http://www.beijing-open-party.org/
大体上看,目前的文字抓取方式,无外乎以下三种方法:
基于文本密度算法的实现,是上述的标签特征类别的方法。基本公式:纯文本字符数/HTML源码字符数。 原始方法:
使用Python的matplotlib对统计的结果进行图示查看,从直方图中直观地可以发现,网页中有一部分的文本密度明显高于其它部分。在整个 过程中还可以使用Tidy软件包来清理HTML代码,实例中演示的Sina页面,使用Tidy进行清理后进行识别的效果要好很多。 从实际状况出发,对算法进行小调整:从以前的文本前后判断,变成标签前后判断。 优点:数据的整体性更好。 整个实现方法所使用的代码量:加入注释以及模式过滤的原脚本大约有200多行Python代码,如果是根据网上论文的原始实现,大约100多行 Python代码。 所参考、的论文中描述的人工智能文本识别方法:
神经网络模型的算法,可以采用机器进行学习的方式进行。不过要注意,学习所采用的原料和实际使用中所针对的目标相似度的关系也很重要。学习的量较 少,可能会达不到完成任务 所需的精度;而学习量过大,出现”过学习”的状况,也可能会出现过度吻合,从而导致对目标数据的变化非常敏感。 其它智能方法,针对HTML标签序列:
不过为了达成我们的目标,找到最窍门的地方,才是最关键的。比如在很多应用场合下,看似粗旷的’一刀切’方法可能效果也非常不错。 这里介绍的自然语言识别只是一个具体的分支应用,而这个大领域还包括很多其他的内容,如逐渐变热的分词技术,也是值得关注的。 总的来说,自然语言识别技术需要根据应用领域、应用环境来提供相应的解决方案。没有银弹! 我一知半解的记录肯定略有偏差,想要详细了解此内容的朋友(如查阅上文提到的论文等内容),欢迎访问宋博士”提取HTML文档正文“的页面以及他的Blog访问详情。
宋博的原文我也先给贴出来,地址:http://www.elias.cn/MyProject/ExtMainText ExtMainText —— 提取html文档正文1. 简介这是一个使用Python语言实现的函数库,能够帮助从html文档中提取文档正文,换句话说也就是能够过滤页面上的广告、栏目导航等非正文内容。 此函数库可以用在从其他网站抓取文章内容的过程中,以及帮助搜索引擎抓取器忽略无关内容,将页面分析集中到网页更有价值的部分。 函数实现的基本原理是“正文标签密度法”,0.2版本计算网页每个html标签下的“正文长度/标签下所有字符总 长”,取文档中密度高于制定阈值的最长部分作为文档正文输出。原理见:The Easy Way to Extract Useful Text from Arbitrary HTML。 对不同网站,因其语言特征及模板外观设计不同,而应当分别指定不同的密度阈值,具体应该根据所有标签的密度分布状况 实验确定。一般英文网站可以取阈值0.5,中文网站使用0.5作为阈值同样能得到不错的输出结果。
函数最终输出的是包含文档正文的html片段,如果需要将提取的正文内容进一步转换为text 纯文本内容,则可以调用html2text。 English Doc, See: En.ExtMainText 2. 脚本下载
2.1 更新记录
3. 使用说明作为库函数使用时可参照源代码的DocString以及“ if __name__ == '__main__' ”部分。也可以直接运行此脚本文件:
python ExtMainText.py 输入的html文件名
另外请注意输入的html文本的编码,在0.2a之后的版本只接受unicode文本作为输入,因此需要提前完成对 输入文档的解码。 4. 后续改进方向相对于固定阈值,使用神经网络等智能方法能够获得更为准确的输出,建议参考也谈网页正文提取[下]以及赖勇浩先生翻译的从HTML文件中抽取正文的简单方案。 5. 与其他实现的比较也谈网页正文提取[下]和The Easy Way to Extract Useful Text from Arbitrary HTML两 篇文章的非人工智能算法的部分(也就是使用静态阈值方法来提取文章正文)在算法和代码实现上都是完全一样的。虽然都是使用文本密度来识别文章正文部分,但 他们对文本密度的计算方法和我的还是存在一定区别,这里以我个人的理解进行简单的比较分析。 他们在计算文本密度时,从头至尾逐步解析html,当遇到一行纯文本内容时,以这一行纯文本的长度作为“文本长 度”,以这一行纯文本结束位置到上一行纯文本结束位置在原始html中所跨越的字符总数作为“字符长度”,并用两者的比值作为文本密度的值。这种计算方法 存在一定的不合理性。从物理意义上来讲,“字符长度”应该是与修饰一段纯文本相关的html代码 总长。但他们的计算方法是将纯文本之前的html标签作为其修饰成分,对于前后匹配的html标签来说,特别是纯文本被括在多层表格 及<div>标签之内的情况,不能保证将各层标签的结束标签算作此段纯文本的修饰内容,相反却很可能将之计算为下一行纯文本所对应的字节长度 组成部分。在极端条件下,也即分析第一行纯文本时,算法会将之前的所有html标签算作字节组成部分,也即包含了<head>部分,这不合理 地极大地降低了密度的取值。虽然扫描一般html页面遇到的第一行纯文本通常是菜单或者导航部分,需要作为正文提取的可能性不大,但这种算法实现方法与其 预期体现的物理意义不能很好地吻合。 我的实现则将每个html标签下涵盖的所有内容作为整体来分析,比如对一个<div>标签,算法将此起 始标签与其对应结束标签之间包括的所有纯文本内容作为“文本长度”,包括的所有字节内容作为“字节长度”,如此计算文本密度,可以保证所涉及的字节一定是 与对应的纯文本密切相关的。因此对于静态阈值方法来说,估计能够获得稍好的正文提取准确度。 当然,那两篇文章的方法也有一定好处,就是对纯文本内容按照行来区分,对后续人工智能的训练和处理过程来说更便于人 的操作和理解。但文中提及的神经网络方法并不是唯一的选择,或许可以不考虑文本行,而是从 html 标签的出现顺序上寻找规律。
|
<P> 对于吉林石化爆炸污染松花江水源的说法,吉林省委宣传部表示目前还没有听说这个情况。吉林市市委宣传处一位人士更是表示,由于哈尔滨处于松花江下游,哈尔滨多年来一直抓住水指标的问题,作水污染的文章,这次停水是否因为吉林石化爆炸所导致还不好说。他告诉记者,自11月14日下午开始,吉林市松花江江北在恢复供水后一直保持正常。
</P>
<P> 吉林石化方面人士强调,爆炸产生的是二氧化碳和水,绝对不会污染到水源,而吉林石化也有自己的污水处理厂,不合格的污水是不会排放到松花江的。本报记者翟宇许
金晶王婷婷 发自哈尔滨 北京<A href="http://weather.qq.com/preend.htm?dc80.htm"
target=_blank> <IMG alt=点击查看北京及更多城市天气预报
src="http://weather.qq.com/images/endnew/weather_icon.gif"
border=0> </A> </P>
|
图3-1 代码片段A,从某HTML页面源文件中摘取的片断
<DD class="nadlinkB marginupdown"> <!--广告 -->
<DD class=focus>
<DIV class="focustit px14">焦点关注 </DIV>
<DD class=foucscnt>
<DIV class=foucscnt1> <A href="http://news.qq.com/a/20051124/000309.htm"
target=new> <IMG class=marginupdown height=88 alt="交友广告在高校派发 寻伊启事专盯单身美女"
src="http://img1.qq.com/news/20051124/2719358.jpg" width=130
border=1> </A> <BR>交友广告专盯单身美女<BR> <BR> <A
href="http://ent.qq.com/a/20051124/000048.htm" target=new> <IMG
class= marginupdown height=88 src="http://img1.qq.com/ent/20051124/2720851.jpg"
width=130 border=0> </A> <BR> 怀孕王菲遭媒体“围堵”<BR> </DIV>
<DIV class=foucscnt2> · <A href="http://news.qq.com/a/20051120/000704.htm"
target=_blank> 小泉谈中日关系 称不担心中日交恶(图) </A> <BR> · <A
href="http://news.qq.com/a/20051119/000757.htm" target=_blank> 戒毒所警察强奸女生被判10年
不服判决 </A> <BR> · <A href="http://news.qq.com/a/20051118/001595.htm"
target=_blank> 甘肃省委宣传部原副部长石星光遇害< /A> <BR> · <A
href="http://news.qq.com/a/20051116/001154.htm" target=_blank> 按下劫警键五分钟获救
新版GPS救下的姐命 </A> <BR> · <A href="http://news.qq.com/a/20051110/001447.htm"
target=new>全国中小学后勤工作论坛上鼾声一片(组图) </A> <BR> · <A
href="http://news.qq.com/a/20051110/000472.htm" target=_blank> 孕妇被打流产索赔81万
被告提异议 </A> <BR> <BR> · <A href="http://news.qq.com/a/20051124/000469.htm"
target=new> 女子结婚3年未孕 医院检查才知是男儿身 </A> <BR> · <A
href="http://news.qq.com/a/20051124/000540.htm" target=new> 变性美女返家
3万乡亲敲锣打鼓迎接(图) </A> <BR> · <A href="http://news.qq.com/a/20051124/000833.htm"
target=new> 女教师多次性骚扰14岁男生被判软禁(图) </A> <BR> · <A
href="http://news.qq.com/a/20051119/000154.htm"
target=new> 网络工程师网上散发前女友裸照(图) </A> <BR> · <A
href="http://news.qq.com/a/20051110/001756.htm"
target=new> 丈夫迷网络色情与老婆演淫秽真人秀(图) </A> <BR> </DIV>
<DIV class=foucscnt3> <A href="http://sports.qq.com/a/20051124/000243.htm"
target=new> <IMG class=marginupdown height=88 alt=鲁尼偷腥事件女主角裸照
src="http://img1.qq.com/sports/20051124/2720121.jpg"
width=130> </A> <BR> 鲁尼偷腥事件女主角裸照 <BR> <BR> <A
href="http://news.qq.com/a/20051124/001281.htm" target=new> <IMG
class=marginupdown height=88 alt="千万富豪驾宝马高校征婚 传单散10所高校"
src="http://img1.qq.com/news/20051124/2723345.jpg" width=130
border=1> </A> <BR> 千万富豪驾宝马高校征婚 <BR> </DIV>
|
图3-2 代码片段B,从同一HTML页面源文件中摘取的片断
代码片段A的统计分析:
代码片段B的统计分析: