zoukankan      html  css  js  c++  java
  • 大数据处理之道 (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


  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6873202.html
Copyright © 2011-2022 走看看