当前位置: 首页 > news >正文

微信小程序建站企业系统培训平台

微信小程序建站,企业系统培训平台,中国城乡建设部网站房贴文件,专业网页设计师培训机构转载自 Jsoup代码解读之六-parser(下)最近生活上有点忙#xff0c;女儿老是半夜不睡#xff0c;精神状态也不是很好。工作上的事情也谈不上顺心#xff0c;有很多想法但是没有几个被认可#xff0c;有些事情也不是说代码写得好就行的。算了#xff0c;还是端正态度…转载自   Jsoup代码解读之六-parser(下)最近生活上有点忙女儿老是半夜不睡精神状态也不是很好。工作上的事情也谈不上顺心有很多想法但是没有几个被认可有些事情也不是说代码写得好就行的。算了还是端正态度毕竟资历尚浅我还是继续我的。 读Jsoup源码并非无聊目的其实是为了将webmagic做的更好一点毕竟parser也是爬虫的重要组成部分之一。读了代码后收获也不少对HTML的知识也更进一步了。 DOM树产生过程 这里单独将TreeBuilder部分抽出来叫做语法分析过程可能稍微不妥其实就是根据Token生成DOM树的过程不过我还是沿用这个编译器里的称呼了。 TreeBuilder同样是一个facade对象真正进行语法解析的是以下一段代码 !-- lang: java -- protected void runParser() {while (true) {Token token tokeniser.read();process(token);if (token.type Token.TokenType.EOF)break;} }TreeBuilder有两个子类HtmlTreeBuilder和XmlTreeBuilder。XmlTreeBuilder自然是构建XML树的类实现颇为简单基本上是维护一个栈并根据不同Token插入节点即可 !-- lang: java -- Override protected boolean process(Token token) {// start tag, end tag, doctype, comment, character, eofswitch (token.type) {case StartTag:insert(token.asStartTag());break;case EndTag:popStackToClose(token.asEndTag());break;case Comment:insert(token.asComment());break;case Character:insert(token.asCharacter());break;case Doctype:insert(token.asDoctype());break;case EOF: // could put some normalisation here if desiredbreak;default:Validate.fail(Unexpected token type: token.type);}return true; }insertNode的代码大致是这个样子(为了便于展示对方法进行了一些整合) !-- lang: java -- Element insert(Token.StartTag startTag) {Tag tag Tag.valueOf(startTag.name());Element el new Element(tag, baseUri, startTag.attributes);stack.getLast().appendChild(el);if (startTag.isSelfClosing()) {tokeniser.acknowledgeSelfClosingFlag();if (!tag.isKnownTag()) // unknown tag, remember this is self closing for output. see above.tag.setSelfClosing();} else {stack.add(el);}return el; }HTML解析状态机 相比XmlTreeBuilderHtmlTreeBuilder则实现较为复杂除了类似的栈结构以外还用到了HtmlTreeBuilderState来构建了一个状态机来分析HTML。这是为什么呢不妨看看HtmlTreeBuilderState到底用到了哪些状态吧在代码中中用!-- State: --gt;标明状态 !-- lang: html -- !-- State: Initial -- !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd !-- State: BeforeHtml -- html langzh-CN xml:langzh-CN xmlnshttp://www.w3.org/1999/xhtml !-- State: BeforeHead -- head!-- State: InHead --script typetext/javascript//!-- State: Text --function xx(){}/scriptnoscript!-- State: InHeadNoscript --Your browser does not support JavaScript!/noscript /head !-- State: AfterHead -- body !-- State: InBody -- textarea!-- State: Text --xxx /textarea table!-- State: InTable --!-- State: InTableText --xxxtbody!-- State: InTableBody --/tbodytr!-- State: InRow --td!-- State: InCell --/td/tr /table /html这里可以看到HTML标签是有嵌套要求的例如tr,td需要组合table来使用。根据Jsoup的代码可以发现HtmlTreeBuilderState做了以下一些事情 语法检查例如tr没有嵌套在table标签内则是一个语法错误。当InBody状态直接出现以下tag时则出错。Jsoup里遇到这种错误会发现这个Token的解析并记录错误然后继续解析下面内容并不会直接退出。 !-- lang: java --InBody {boolean process(Token t, HtmlTreeBuilder tb) {if (StringUtil.in(name,caption, col, colgroup, frame, head, tbody, td, tfoot, th, thead, tr)) {tb.error(this);return false;}} 标签补全例如head标签没有闭合就写入了一些只有body内才允许出现的标签则自动闭合/head。HtmlTreeBuilderState有的方法anythingElse()就提供了自动补全标签例如InHead状态的自动闭合代码如下 !-- lang: java --private boolean anythingElse(Token t, TreeBuilder tb) {tb.process(new Token.EndTag(head));return tb.process(t);} 还有一种标签闭合方式例如下面的代码 !-- lang: java --private void closeCell(HtmlTreeBuilder tb) {if (tb.inTableScope(td))tb.process(new Token.EndTag(td));elsetb.process(new Token.EndTag(th)); // only here if th or td in scope}实例研究 缺少标签时会发生什么事 好了看了这么多parser的源码不妨回到我们的日常应用上来。我们知道在页面里多写一个两个未闭合的标签是很正常的事那么它们会被怎么解析呢 就拿div标签为例 漏写了开始标签只写了结束标签 !-- lang: java --case EndTag:if (StringUtil.in(name,div,dl, fieldset, figcaption, figure, footer, header, pre, section, summary, ul)) { if (!tb.inScope(name)) {tb.error(this);return false;} } 恭喜你这个/div会被当做错误处理掉于是你的页面就毫无疑问的乱掉了当然如果单纯多写了一个/div好像也不会有什么影响哦(记得有人跟我讲过为了防止标签未闭合而在页面底部多写了几个/div的故事)写了开始标签漏写了结束标签这个情况分析起来更复杂一点。如果是无法在内部嵌套内容的标签那么在遇到不可接受的标签时会进行闭合。而div标签可以包括大多数标签这种情况下其作用域会持续到HTML结束。 好了parser系列算是分析结束了其间学到不少HTML及状态机内容但是离实际使用比较远。下面开始select部分这部分可能对日常使用更有意义一点。 最后附上我的Jsoup系列博客及源码地址http://github.com/code4craft/jsoup-learning
http://wiki.neutronadmin.com/news/426795/

相关文章:

  • 做平面设计兼职的网站有哪些wordpress更改链接后404
  • 个人网站开发教程云商城源码
  • 德州公司做网站中国十大电商平台
  • 国内个人网站欣赏北京搬家公司24小时服务电话
  • 厦门网站建设哪家不错昆明做网站找哪个公司好
  • 常德政务网站做外贸收费的网站
  • 专门做奢侈品的网站建立网站需要多少钱湖南岚鸿
  • 怎么做镜像网站百度推广登录平台网址
  • 福州网站服装设计基础
  • 小米官方网站开发版中科宁波网站建设
  • 网络营销导向企业网站建设龙岗做网站的
  • 网站开发速成培训机构行业网站导航源码
  • wordpress搭建门户中小企业怎么优化网站
  • 怎么做狼视听网站从零开始学wordpress
  • 建站做网站哪家好网站建设毕业设计中期检查
  • 没有域名怎么访问网站自己可以做视频网站吗
  • app网站制作要多少费用华为云和wordpress
  • 网站建设上机课wordpress怎么禁用多域名
  • 灰色网站怎么做seo买域名去哪个网站
  • 中山网站建设文化平台重庆开发app的公司
  • 外贸建站是什么意思WordPress 微信登录 免费
  • cf租号网站怎么做的网站建设之前必须 域名备案
  • 常用网站架构怎么做网站详情页
  • 常州微信网站制作网站建设收费标准新闻
  • 中国住房建设部网站首页建设用地规划许可证去哪个网站查
  • 做网站硬件网站备案 手印随便
  • 网站建设愿景怎样申请网站域名和空间
  • 重庆seo网站设计代做论文网站好
  • 注册 网站开发 公司北京seo费用是多少
  • 网站建设与维护模拟一汉鼎宇佑建设投资网站