唉,没来这里好久了,也意味着我这一年多来没干什么正事儿,是回归的时候了!(简单谈谈爬虫的解析器)

现在ACM不搞了,一看上一篇文章的发布时间是13年2月,着实把自己吓了一跳。既然已经开始实习了,那就搞搞技术吧,但是算法的学习还不能断,算法导论还有好多知识没学呢嗯,既然实习期间分配的任务是搞一搞爬虫,那我就来说说java的html解析器的具体解析方式吧。首先网络爬虫的大体运行原理大家应该都知道了,如果不知道的话去Google一下,一搜一大把,我就不在这里赘述了。我主要想说的是具体的解析过程到底是怎么运作的,请看下面一段代码,不,是两段代码:

 1 InputStream in = url.openStream();
 2
 3 InputStreamReader isr = new InputStreamReader(in, this.charset);//获取HTML页面的整个内容。
 4
 5 parentnode = getParentNode(urlstr);
 6 DefaultMutableTreeNode treenode = addNode(parentnode, newnode);
 7 SpiderParserCallback cb = new SpiderParserCallback(treenode);//声明解析器回调对象,里面的所有的回调方法均表示对特定标签的一种处理,具体回调是什么意思我将在后                                       续详细介绍。
 8
 9 ParserDelegator pd = new ParserDelegator();          //声明解析器。
10 pd.parse(isr, cb, true);                     //解析器开始解析,第一个参数表示解析的内容,第二个参数表示解析出一定标签后,调用一定的回调方法。
 1 public class SpiderParserCallback extends HTMLEditorKit.ParserCallback {      //此类的所有方法均针对解析器解析出的标签做出相应的操作。
 2         private UrlTreeNode node;
 3         private DefaultMutableTreeNode treenode;
 4         private String lastText = "";
 5
 6         public SpiderParserCallback(DefaultMutableTreeNode atreenode) {
 7             this.treenode = atreenode;
 8             this.node = ((UrlTreeNode) this.treenode.getUserObject());
 9         }
10
11         public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {    //专门解析简单的标签。
12             if (t.equals(HTML.Tag.IMG)) {
13                 this.node.addImages(1);
14                 return;
15             }
16             if (t.equals(HTML.Tag.BASE)) {
17                 Object value = a.getAttribute(HTML.Attribute.HREF);
18                 if (value != null) {
19                     this.node.setBase(Spider.fixHref(value.toString()));
20                 }
21             }
22         }
23
24         public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {    //专门解析带有开始结束标签的复杂字段。
25             if (t.equals(HTML.Tag.TITLE)) {
26                 this.lastText = "";
27                 return;
28             }
29             if (t.equals(HTML.Tag.A)) {
30                 Object value = a.getAttribute(HTML.Attribute.HREF);
31                 if (value != null) {
32                     this.node.addLinks(1);
33                     String href = value.toString();
34                     href = Spider.fixHref(href);
35                     if (href.contains("javascript:")) {
36                         return;
37                     }
38                     try {
39                         URL referencedURL = new URL(this.node.getBase(), href);
40                         Spider.this.searchWeb(this.treenode,
41                                 referencedURL.getProtocol() + "://"
42                                         + referencedURL.getHost()
43                                         + referencedURL.getPath());
44                     } catch (MalformedURLException e) {
45                         Spider.this.messageArea
46                                 .append("    Bad URL encountered 2: " + href
47                                         + "\n\n");
48                         return;
49                     }
50                 }
51             }
52         }

  由上述两段代码可知解析过程大致是,parser解析器解析出HTML内容,分类成各种标签,然后各种标签回调解析器里的各种对应方法最终实现解析器的工作流程。这些只是我浅薄的理解,肯定不很透彻,而且表达的也不是很清楚,但还是请大家多多批评指正,共同进步!
时间: 2024-11-03 21:32:04

唉,没来这里好久了,也意味着我这一年多来没干什么正事儿,是回归的时候了!(简单谈谈爬虫的解析器)的相关文章

SpringBoot系列之集成Thymeleaf用法手册

目录 1.模板引擎 2.Thymeleaf简介 2.1).Thymeleaf定义 2.2).适用模板 3.重要知识点 3.1).th:text和th:utext 3.2).标准表达式 3.3).Thymeleaf遍历 3.4).公共模块抽取 3.5).行内写法介绍 3.6).Thymeleaf语法规则 4.SpringBoot集成 4.1).Springboot集成Thymeleaf简介 4.2).Thymeleaf自动配置源码简单分析 SpringBoot系列之Thymeleaf语法简单介绍

021.XML

一.XML html:超文本标记语言 (静态网页) XML: 可扩展的标记语言 标记语言:跨平台,跨语言 背景: SGML:(统一标准标记语言)元语言(源语言-可以开发其他语言) IBM:平台,语言 瓶颈:1.语言艰涩,难懂 2.局域网 网络时代:网站 技术基础(跨平台,跨语言) SGML: W3C:互联网联盟组织 互联网的标准的制定由W3C完成 html:由sgml编写,固定的标记实现功能<img><p>(简单) 频繁升级: XML(可扩展):瘦身版的sgml(1比sgml简单2

TTB 基本

中文名 ,线程构建模块 外文名 Thread Building Blocks 缩    写 TBB 开    发 intel 目录 1线程构建模块 2黑体亮温 3斜交载重轮胎 4串联球轴承 1线程构建模块编辑 TBB,Thread Building Blocks,线程构建模块,是Intel公司开发的并行编程开发的工具. OSCON 上,Intel 宣布,Threading Building Blocks,Intel 众多软件开发工具中的一个,open source了.协议是 GPLv2. TBB

spark结构化数据处理:Spark SQL、DataFrame和Dataset

本文讲解Spark的结构化数据处理,主要包括:Spark SQL.DataFrame.Dataset以及Spark SQL服务等相关内容.本文主要讲解Spark 1.6.x的结构化数据处理相关东东,但因Spark发展迅速(本文的写作时值Spark 1.6.2发布之际,并且Spark 2.0的预览版本也已发布许久),因此请随时关注Spark SQL官方文档以了解最新信息. 文中使用Scala对Spark SQL进行讲解,并且代码大多都能在spark-shell中运行,关于这点请知晓. 概述 相比于

CSV文件格式解析器的实现:从字符串Split到FSM

本文分为5小节,基本上就是我刚接触CSV文件到思考.实践做一个CSV解析器的过程的还原.希望我的思路也能带领你一步步从浅到深认识CSV文件格式. 1.简单的CSV解析器实现. 2.简单实现的CSV解析器的问题 3. CSV格式的定义 4.用FSM(有限状态机)来做CSV格式解析. 5.为什么使用CSV格式 1.简单的CSV解析器实现. 最近有一个需求,读取CSV格式的配置.CSV是CommaSeparated Value(逗号分隔值)的缩写,通常用文本表示数据.CSV格式数据的结构类似表格,不同

说你玻璃心的就想免费耍流氓

先讲个故事,各位帮忙分析下,看F是别人常说的职场玻璃心还是领导故意整他. F和领导的故事 有位朋友F,第一次找我聊天是两个月前,他说部门换了经理,新经理特别强势,对他横挑鼻子竖挑眼,总是碾压他,他想到上班就很痛苦,上班时间也不能专心工作,老担心经理突然挑他的不是. 他还说,每次技术讨论或项目启动会议,别人说什么都没关系,哪怕与项目无关的话题.与正讨论的技术主题无关的话题都没关系,经理都面带笑容地倾听,就算别人说的技术见解明显是不对的,经理也会包容,顶多转换话题.而他就不同,只要他一说话,经理要么

Razor内幕之解析

ASPX语法比较简单,所以ASPX解析器几乎完全是通过正则表达式来实现的.Razor解析器与ASPX解析器之间有很大不同,它实际上分为三个独立的组件: 1)理解基础HTML语法的标记解析器: 2)理解基础C#或者VB语法的代码解析器: 3)理解标记和代码如何混合的中央控制器 所以Razor解析器有三个参与者:代码解析器,标记解析器,代码解析器.三个组件相互配合,协同工作完成对Razor文档的解析.Razor解析器有三种状态,分别是:解析标记文档.解析标记块,解析代码块,任何情况下解析器都处在以上

Jsoup 的认识和简单使用

之前做学校软件协会APP的时候,由于自己不会在服务端写接口,所以服务端一直是由另一位Z同学完成的,但是突然Z同学被老师调到泸州帮以前的学长做一个月的临时web开发去了,所以协会APP的接口只做了一部分就没了.我也很是无奈啊,想自己边学边做,但是时间不允许,马上就要做毕业设计了,而且还要帮老师写教材.但自己的需求其实还算比较简单,只需要在已做好的网站上获取信息即可,而且之前就知道有网络爬虫这种东西(虽然自己没实现过),所以我想在网上找一找相关的资料,于是便在网上找到了一款HTML解析器,也就是js

c++技术系统学习资料

原文地址:http://www.open-open.com/bbs/view/1323401558374 1.C++各大有名库的介绍--C++标准库 2.C++各大有名库的介绍--准标准库Boost 3.C++各大有名库的介绍--GUI 4.C++各大有名库的介绍--网络通信 5.C++各大有名库的介绍--XML 6.C++各大有名库的介绍--科学计算 7.C++各大有名库的介绍--游戏开发 8.C++各大有名库的介绍--线程 9.C++各大有名库的介绍--序列化 10.C++各大有名库的介绍-