Evernote的浏览器插件Web Clipper是怎么样找到页面中的正文区域的

我刚好做过这种功能的东西,要找出网页内的所有节点,然后根据其各方面特征对其正文节点的可能性进行评分,1、可视面积大于300x50像素,加分(服务端分析时,无法获知页面元素尺寸,此步可省略)2、className或id为header|foot|sidebar…减分3、className或id包含content…加分4、子节点中纯文本节点多的,加分5、有大图片,有多个大图片,加分6、innerText长度大于150,内含逗号,句号多的, 加分(此步骤最有参考价值)然后评分最高的节点即为正文节点,如果页面HTML结构规范,页面有正文区,并且正文内容不是太短,通过以上特征检查找出正文区的可能性是相当大的,准确率99%。清理一下格式后,可以通过在页面内构建表单把正文内容提交到服务器上
■网友
原理上@王朝 说的就是对的——废话人家自己做过。就是把各个 html 元素都拿来审视一下,打一个分,然后分高的留下低的去掉。我补充一点,其实也不是我的知识,是我看过的代码里的:关于 class name 和 id 的判断,可以用一系列正则表达式匹配,最终给出一个是否是正文的可能性,比如下面这段代码:/** * All of the regular expressions in use within readability. * Defined up here so we don\u0026#39;t instantiate them repeatedly in loops. **/regexps: {\tunlikelyCandidates: /combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup/i,\tokMaybeItsACandidate: /and|article|body|column|main|shadow/i,\tpositive: /article|body|content|entry|hentry|main|page|pagination|post|text|blog|story/i,\tnegative: /combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget/i,\textraneous: /print|archive|comment|discuss|e?mail|share|reply|all|login|sign|single/i,\tdivToPElements: /\u0026lt;(a|blockquote|dl|div|img|ol|p|pre|table|ul)/i,\treplaceBrs: /(\u0026lt;br*\u0026gt;*){2,}/gi,\treplaceFonts: /\u0026lt;(\\/?)font*\u0026gt;/gi,\ttrim: /^\\s+|\\s+$/g,\tnormalize: /\\s{2,}/g,\tkillBreaks: /(\u0026lt;br\\s*\\/?\u0026gt;(\\s|\u0026amp;nbsp;?)*){1,}/g,\tvideos: /http:\\/\\/(www\\.)?(youtube|vimeo)\\.com/i,\tskipFootnoteLink: /^\\s*(\\{1,2}\\]?|^|edit|citation needed)\\s*$/i,\tnextLink: /(next|weiter|continue|\u0026gt;(|$)|?(|$))/i, // Match: next, continue, \u0026gt;, \u0026gt;\u0026gt;, ? but not \u0026gt;|, ?| as those usually mean last.\tprevLink: /(prev|earl|old|new|\u0026lt;|?)/i},注意上面代码中的几个键的名称,顾名思义就知道什么意思了吧?再看看后面的正则表达式,就很明了了。最后给出上面代码的源文件,这是识别正文的 js 库,叫做 readablility.js,我试用过基于它开发的 chrome 扩展 Super Full Feeds for Google Reader,实际效果不错,如果直接使用的话,一是请注意版权,二是,国内的某些网页使用的 class 和 id 未必是正宗英语,你可能要自己优化一下。


    推荐阅读