readability-lxml 源码解析(四):总结

发布时间 2023-07-11 11:17:05作者: 绝不原创的飞龙
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>的情况。