score = ( class_weight + name_weight + children_comma_count + 1 + min(children_text_len // , 3) ) / (1 - link_density)
(1)正文元素,就是只在正文中可能出现的元素,比如<h1>~<h6> <p> <pre> <blockquote>
这三个,导航栏什么的绝对不可能有,侧栏也很少出现这些东西。
(2)正文容器,就是包含正文并且不包含正文之外元素的元素。可能是<div> <section> <article> <main>
,也可能是<td> <span>
什么的(不常见)。我觉得可以只在这里面选,Readability 只是做了加权,并没有对标签名称做硬性限制。
(3)元素和容器的距离,Readability 限制为 2,也就是取正文元素的父节点和祖父节点。我觉得可以制定一套规则,按照距离衰减,比如衰减指数是距离分之一。
(4)ID 和类名是重要的判断依据。这些名称分为正面和负面关键词,正面加权重,负面减权重。并且每一个关键词还分为可能和确定,不过意思正好相反。确定的关键词用于加减权重,可能的关键词用于筛选。例如,可能的正面关键词的标签会保留,而可能的负面关键词标签一定会移除。
但是,在找不到候选标签的情况下,会不移除可能负面关键词再试一次。这块就显得啰嗦和麻烦。比如给确定和可能的关键词指定不同的权重,避免移除某个关键词造成的二次返工。
(5)从公式中可以看出 Readability 还考虑了文本长度,逗号个数和链接密度,用于区分导航和正文。我觉得可以考虑一下文本密度。
(6)Readability 还考虑了候选元素的兄弟也可能是候选,即正文包含在多个<div>
的情况。