抓取网页生成电子书(暑期实习求职之html算法还是比较满意的?)
优采云 发布时间: 2021-12-08 09:18抓取网页生成电子书(暑期实习求职之html算法还是比较满意的?)
首先,我道歉。这几天忙着联系暑期实习单位,没能及时回复和更新。我还没有做到。如果可以,请帮我一个忙,看看我的实习申请。
对目前的html解析算法还是比较满意的。在这个阶段,经过一些测试,我添加了对 BR、IUPUT、IMG、META、SCRIPT、注释等特殊 html 语法的支持。对于完全符合html语法规范的页面,效果令人满意。缺点是缺乏容错能力,不符合html语法的页面解析可能会出错或异常。如果要把它做成一个完整的html解析器,我认为必须实现一个优先级算法来提供容错能力。不过我觉得这个问题比较复杂,暂时不能很好的解决。现在,我决定采取另一种妥协,即只解析自定义控件而不是普通的 html 控件。使用当前的算法,可以轻松实现此功能。
个人觉得还是建议使用用户控件,然后在控件输出的时候拦截render。但是我个人觉得这种方法不够灵活,无法实际使用负载。我个人更喜欢实现一个轻量级且易于控制的静态页面生成类库,可以轻松自由地定制和扩展。对于大多数网站来说,首页和分类页面请求频繁,内容需要经常更新。Asp.Net的缓存机制是一个不错的选择;但是对于网站的内容页,比如新闻或者软件下载的内容页,请求频率比较低,不适合动态生成或者使用缓存。在这种情况下,最好的选择是生成一个静态页面并将其保存在硬盘上。此外,
如本文开头所述,因联系暑期实习单位,近日暂停开发。这里继续补上上一篇文章中没有完成的内容。
整个解析模块主要由三个类组成:StaticControlFactory、ParseStatusManager和StaticBaseControl。其中,StaticControlFactory主要负责模板的字符分析处理和控件处理;ParseStatusManager 主要负责处理控制分析状态并向StaticControlFactory发出处理命令;StaticBaseControl 是保存相关结果的实体类。
我觉得代码结构还是很清晰的,注释也很多,我就不详细解释了,主要解释几个关键点。StaticControlFactory 使用堆栈来保存控件的层次结构。每当创建新控件时,都会将新控件添加到当前控件的子控件集合中,然后将当前控件压入堆栈,新控件成为当前控件。当新控件解析后,操作反向。ParseStatusManager 的状态管理也采用了类似的方式,但没有前者的层次结构。StaticControlFactory 每次读取边界字符时,都会调用 ParseStatusManager 对象的 ChangeStatus 方法来实现相应的状态转换。ParseStatusManager 对StaticControlFactory 的操作是通过proxy 结合Command 方式实现的。这种方式最大的好处是ParseStatusManager不需要维护StaticControlFactory的大量方法签名,只需要传入合适的命令即可。如果在处理状态转换时需要添加新的处理,只需让StaticControlFactory添加对新命令的支持即可。
为了增加对不符合 body 形式的标签的支持,包括 img 和 br 等可以没有结束或使用短结束标签的标签,StaticControlFactory 中添加了几个方法。ReadNextWord 用于获取控件开始标记后的下一个。词判断当前标签是否为定义的特殊标签,ProcessForScriptBlock用于专门处理Script模块。如果想改变类库引用我们定义的特殊标签,可以在每次读取控件开始标签时使用ReadNextWord读取控件类型,判断正确后开始控件的解析操作;标记控制结束时也进行类似的操作。
目前的计划实际上是我的第二个计划。第一种方案使用递归,思路不是很清楚,调试起来比较麻烦。目前的方案要清晰得多。对于数据绑定,在我的第一个方案中已经部分实现了,主要是使用遍历和反射。遗憾的是,它只支持对对象数组等数据源的支持。主要原因是我现在的项目使用的是petshop3的结构,以数据实体的形式传递数据,没有实现repeat等控件的嵌套形式。捆绑。不过,预计这两个问题都比较简单,可以比较快的实现。我会尽快实现一个可用的版本。