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

现在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                                         + "

");
48                         return;
49                     }
50                 }
51             }
52         }

  由上述两段代码可知解析过程大致是,parser解析器解析出HTML内容,分类成各种标签,然后各种标签回调解析器里的各种对应方法最终实现解析器的工作流程。这些只是我浅薄的理解,肯定不很透彻,而且表达的也不是很清楚,但还是请大家多多批评指正,共同进步!
原文地址:https://www.cnblogs.com/chaosheng/p/4207983.html