• 大数据处理之道 (htmlparser获取数据<一>)


    一:简单介绍

    (1)HTML Parser是一个用于解析HtmlJava的库。可採用线性或嵌套两种方式。主要用于网页的转换或提取,他有一些特性:过滤器filter,遍历器visitors,通常的标签tagName和易用的JavaBeans

    它是一个高速,健壮,并严格測试过的组件。

    (2)个人理解:HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果。各个节点代表HTML中的标签和属性值,很类似于XML解析器解析后的结果,也类似与html dom的结构。HTMLParser訪问结果内容的方法有两种:使用Filter和使用Visitor,一般Filter用的多一些,用于提取特定的网页信息

    (3)官方API说明    (须要Google的)

    二:主要函数功能说明:

    (1)HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完毕了对于HTML页面的分析工作。这个类有以下几个构造函数:

     public Parser ();
        public Parser (Lexer lexer, ParserFeedback fb);
       public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
        public Parser (String resource, ParserFeedback feedback) throws ParserException;
       public Parser (String resource) throws ParserException;
        public Parser (Lexer lexer);
        public Parser (URLConnection connection) throws ParserException;
        和一个静态类 public static Parser createParser (String html, String charset);

    (2)HTMLParser将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础


    请看Node的定义:
    public interface Node extends Cloneable;
    Node中包括的方法有几类:
    对于树型结构进行遍历的函数,这些函数最easy理解:
    Node getParent ():取得父节点
    NodeList getChildren ():取得子节点的列表
    Node getFirstChild ():取得第一个子节点
    Node getLastChild ():取得最后一个子节点
    Node getPreviousSibling ():取得前一个兄弟(不好意思,英文是兄弟姐妹。直译太麻烦并且不符合习惯,对不起女同胞了)
    Node getNextSibling ():取得下一个兄弟节点
    取得Node内容的函数
    String getText ():取得文本
    String toPlainTextString():取得纯文本信息
    String toHtml () :取得HTML信息(原始HTML

    String toHtml (boolean verbatim):取得HTML信息(原始HTML
    String toString ():取得字符串信息(原始HTML
    Page getPage ():取得这个Node相应的Page对象
    int getStartPosition ():取得这个NodeHTML页面中的起始位置
    int getEndPosition ():取得这个NodeHTML页面中的结束位置

    (3)其他函数

    void collectInto (NodeList list, NodeFilter filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。


    用于Visitor遍历的函数:
    void accept (NodeVisitor visitor):对这个Node应用visitor
    用于改动内容的函数。这类用得比較少
    void setPage (Page page):设置这个Node相应的Page对象
    void setText (String text):设置文本

    void setChildren (NodeList children):设置子节点列表

    (4)用于Filter过滤的函数

    顾名思义。Filter就是对于结果进行过滤,取得须要的内容。HTMLParserorg.htmlparser.filters包之内一共定义了16个不同的Filter,也能够分为几类。
    推断类Filter
    TagNameFilter   ----- html标签指定指定过滤器
    HasAttributeFilter  ------  属性和属性值指定过滤器

    HasChildFilter
    HasParentFilter
    HasSiblingFilter
    IsEqualFilter
    逻辑运算Filter
    AndFilter  ------ 同一时候满足两个或多个过滤条件的过滤器
    NotFilter   ------  非
    OrFilter    -------  或
    XorFilter
    其它Filter
    NodeClassFilter
    StringFilter   -------  过滤敏感信息的过滤器
    LinkStringFilter  --------- 过滤敏感链接信息的过滤器
    LinkRegexFilter
    RegexFilter
    CssSelectorNodeFilter
    全部的Filter类都实现了org.htmlparser.NodeFilter接口。

    这个接口仅仅有一个主要函数:
    boolean accept (Node node);
    各个子类分别实现这个函数。用于推断输入的Node是否符合这个Filter的过滤条件,假设符合。返回true。否则返回false

    三:html结构解析图示说明

    (1)html代码

    <html>
       <head>
       <title>HTML DOM</title>
       </head>
       <body>
       <h1>DOM的结构</h1>
       <p><a href="href">链接</a></p>
       </body>
    </html>

    (2)html的dom结构(即parser后的解析树形结构)


    (3)说明

    • 由结构图中我们能够看到。整个文档就是一个文档节点。

    • 而每个HMTL标签都是一个元素节点。
    • 标签中的文字则是文字节点。
    • 标签的属性是属性节点。
    • 一切都是节点……
    总之,节点树的概念从图中一目了然。最上面的就是“树根”了。节点之间有父子关系。祖先与子孙关系。兄妹关系。这些关系从图中也非常好看出来,直接连线的就是父子关系了。

    而有一个父亲的就是兄妹关系……很多其它dom详见W3C


  • 相关阅读:
    Spring_依赖注入DI
    Spring_懒加载与非懒加载
    Spring_提示模板配置/搭建spring框架/单例与多例/初始化方法和销毁方法
    Spring
    Mybatis_二级缓存
    Mybatis_一级缓存
    Mybatis_一对多延迟加载
    Mybatis_一对一查询
    MapReduce的核心资料索引 [转]
    Hadoop家族的各个成员
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6873202.html
Copyright © 2020-2023  润新知