`
simpledev
  • 浏览: 196931 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

htmlparser学习总结

阅读更多

由于公司需要,开发了一个抓取网上数据爬虫的程序,如抓取点评网、阿里巴巴网和慧聪网城市和行业信息,采用的技术是:htmlparser。本文是简单的介绍htmlparser抓取的常用代码示例,具体详见:htmlparser下载包中的api文档。

下面理清一下Node节点与节点之间的关系及NodeFilter的全部实现类。

Interface Node

|||All Known Subinterfaces:

RemarkRemarkNode ,

TagAppletTag, BaseHrefTag, BodyTag, Bullet, BulletList, CompositeTag, DefinitionList, DefinitionListBullet, Div, DoctypeTag, FormTag, FrameSetTag, FrameTag, HeadingTag, HeadTag, Html, ImageTag, InputTag, JspTag, LabelTag, LinkTag, MetaTag, ObjectTag, OptionTag, ParagraphTag, ProcessingInstructionTag, ScriptTag, SelectTag, Span, StyleTag, TableColumn, TableHeader, TableRow, TableTag, TagNode, TextareaTag, TitleTag,

TextTextNode

 

Interface NodeFilter

|||All Known Implementing Classes:

AndFilter, AndFilterWrapper, CssSelectorNodeFilter, Filter, HasAttributeFilter, HasAttributeFilterWrapper, HasChildFilter, HasChildFilterWrapper, HasParentFilter, HasParentFilterWrapper, HasSiblingFilter, HasSiblingFilterWrapper, IsEqualFilter, LinkRegexFilter, LinkStringFilter, NodeClassFilter, NodeClassFilterWrapper, NotFilter, NotFilterWrapper, OrFilter, OrFilterWrapper, RegexFilter, RegexFilterWrapper, StringFilter, StringFilterWrapper, TagNameFilter, TagNameFilterWrapper

 

 

|||基本思路:前提是对整个html代码的分析,特别是需要抓取的html内容的分析。

第一步:Parser对象的创建并且设置编码,parser.setEncoding("UTF-8"); //UTF-8html文件中的编码格式,保持一致。

第二步:创建合适的Filter过滤器

第三步:解析获取NodeList对象,然后该对象的toHtml()方法获取字符串,又可以重新创建Parser对象,如果可以一次定位到抓取的内容是最好的,如果不可以,方法是:逐步缩小范围。

第四步:对抓取的内容进行字符串处理,数据库操作等。NodeList对象的toNodeArray()方法获取Node[]节点数组,如LinkTag link = (LinkTag)node[0]; link.getLinkText()//获取链接文本 link.getLink(); //获取链接

 

|||Detail

1.       创建Parser对象的方法:(有的时候会抛出网络异常,可以尝试下面三种方法解决问题)

1.1最普通常规的方式

Parser(String resource)

          Creates a Parser object with the location of the resource (URL or file).

 

Parser(URLConnection connection)

          Construct a parser using the provided URLConnection.

 

static Parser createParser(String html, String charset)

          Creates the parser on an input string.

 

1.2 使用java网络链接代理方式

       public static URLConnection getUrlAgent(String strUrl){

              HttpURLConnection connection = null;

              try{

                     URL url = new URL(strUrl);

                     connection = (HttpURLConnection) url.openConnection();

              connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

              } catch (MalformedURLException e) {

                     e.printStackTrace();

              } catch (IOException e) {

                     e.printStackTrace();

              }

        return connection;

       }

Parser parser = new Parser(getUrlAgent(strUrl));

//存在中文转码的情况

String url = "http://localhost:8081/company/kw/%CB%FE%B5%F5.html";

           url = java.net.URLDecoder.decode(url, "gb2312");

           System.out.println(url);

           URLConnection conn = getUrlAgent(url);

           Parser parser = new Parser(conn);

 

1.3使用httpclient抓取网页内容流方式

       public static String convertStreamToString(InputStream is)

           throws UnsupportedEncodingException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(is,

              "gbk"));

       StringBuilder sb = new StringBuilder();

       String line = null;

       try {

           while ((line = reader.readLine()) != null) {

              sb.append(line + "\n");

           }

       } catch (IOException e) {

           e.printStackTrace();

       } finally {

           try {

              is.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

       }

       return sb.toString();

    }

 

    // 下载内容

    public static String urlContent(String urlString) throws HttpException,

           IOException {

       HttpClient client = new HttpClient();

       GetMethod get = new GetMethod(urlString);

       client.executeMethod(get);

       // System.out.print("aaaaa:"+get.getResponseCharSet()); //GBK

       InputStream iStream = get.getResponseBodyAsStream();

       String contentString = convertStreamToString(iStream);

       get.releaseConnection();

       return contentString;

    }

 

String url = "http://localhost:8081/company/c-1031646_province-%B9%E3%B6%AB_n-y.html/";

Parser parser = new Parser(urlContent(url));

 

 

2. NodeList对象

2.1单个标签本身过滤的情况

       TagNameFilter filter = new TagNameFilter(tag);

      NodeList nodeList = parser.parse(filter);

2.2单个标签同级(即标签与标签之间是兄弟平行关系)过滤的情况

       TagNameFilter filter = new TagNameFilter(tag);

       HasSiblingFilter hasSiblingFilter = new HasSiblingFilter(filter);

       NodeList nodeList = parser.parse(hasSiblingFilter);

2.3单个标签上级(即标签与标签之间是父子关系)过滤的情况

TagNameFilter filter = new TagNameFilter(tag);

       HasChildFilter hasChildFilter = new HasChildFilter(filter);

       NodeList nodeList = parser.parse(hasChildFilter);

2.4单个标签下级(即标签与标签之间是父子关系)过滤的情况

       TagNameFilter filter = new TagNameFilter(tag);

       HasParentFilter hasParentFilter = new HasParentFilter(filter);

       NodeList nodeList = parser.parse(hasParentFilter);

3.两个标签组合的情况,组合分为:AndFilter, OrFilter, NotFilter,同上也分为:本身,同级HasSiblingFilter,上级HasChildFilter和下级HasParentFilter过滤

       AndFilter filter = new AndFilter (

                    new TagNameFilter (tag),

                    new TagNameFilter (tagother)

                );

       AndFilter filter = new AndFilter (

                            new HasSiblingFilter (

                    new TagNameFilter (tag)),

                new HasSiblingFilter (

                    new TagNameFilter (tagother))

                );

       AndFilter filter = new AndFilter (

                            new HasChildFilter (

                    new TagNameFilter (tag)),

                new HasChildFilter (

                    new TagNameFilter (tagother))

                );

AndFilter filter = new AndFilter (

                            new HasParentFilter (

                    new TagNameFilter (tag)),

                new HasParentFilter (

                    new TagNameFilter (tagother))

                );

 

OrFilter filter = new OrFilter (

                    new TagNameFilter (tag),

                    new TagNameFilter (tagother)

                );

OrFilter filter = new OrFilter (

                            new HasSiblingFilter (

                    new TagNameFilter (tag)),

                new HasSiblingFilter (

                    new TagNameFilter (tagother))

                );

       OrFilter filter = new OrFilter (

                            new HasChildFilter (

                    new TagNameFilter (tag)),

                new HasChildFilter (

                    new TagNameFilter (tagother))

                );

       OrFilter filter = new OrFilter (

                            new HasParentFilter (

                    new TagNameFilter (tag)),

                new HasParentFilter (

                    new TagNameFilter (tagother))

                );

      

       AndFilter filter = new AndFilter (

                    new TagNameFilter (tag),

                    new NotFilter(new TagNameFilter (tagother))

                );

AndFilter filter = new AndFilter (

                            new HasSiblingFilter (

                    new TagNameFilter (tag)),

                new NotFilter (

                    new TagNameFilter (tagother))

                );

       AndFilter filter = new AndFilter (

                            new HasChildFilter (

                    new TagNameFilter (tag)),

                new NotFilter (

                    new TagNameFilter (tagother))

                );

       AndFilter filter = new AndFilter (

                            new HasParentFilter (

                    new TagNameFilter (tag)),

                new NotFilter (

                    new TagNameFilter (tagother))

                );

       NodeList nodeList = parser.parse(filter);

 

4.根据标签属性或标签属性和属性值过滤

       HasAttributeFilter filter = new HasAttributeFilter (attribute);

      

HasAttributeFilter filter = new HasAttributeFilter (attribute,value);

NodeList nodeList = parser.parse(filter);

5.标签类过滤的情况   

NodeFilter filter = new NodeClassFilter(LinkTag.class);  //如链接标签

      

       NodeFilter filter = new NodeClassFilter(TextNode.class); //如文本标签

       NodeList nodeList = parser.parse(filter);

       Node[] nodes = nodeList.toNodeArray();  //返回Node[]节点数组的情况

6.对表格的过滤获取

NodeClassFilter filter = new NodeClassFilter(TableTag.class);

               NodeList nodeList = parser.parse(filter);

               TableTag tableTag = (TableTag) nodeList.elementAt(0);

               TableRow[] rows = tableTag.getRows();

   

             

for (int j = 0; j < rows.length; j++) {

                  TableRow tr = (TableRow) rows[j];

                  TableColumn[] td = tr.getColumns();

                  for (int k = 0; k < td.length; k++) {

                     LinkTag lt = (LinkTag)td[k].getFirstChild();

                     …… //字符串操作,数据库操作

                  }

              }

 

                 

分享到:
评论

相关推荐

    HtmlParser c#源码+demo

    总结来说,HtmlParser c#源码提供了处理HTML文档的能力,包括解析、查询、提取信息等功能。通过学习源码和示例,开发者可以更好地理解和应用这个工具,同时也可以根据需要对其进行定制,以适应不同的项目需求。

    htmlparser-1.0.5

    5. **API设计**:HTMLParser的API设计简洁明了,易于学习和使用。开发者可以通过`HTMLDocument`、`Tag`、`Attribute`等类来操作HTML元素,通过`Handler`接口来定义自定义的事件处理器。 6. **兼容性**:HTMLParser ...

    Winista.Htmlparser 源码 C#类库 帮助文档

    总结来说,Winista.Htmlparser是一个强大且易用的C# HTML解析库,提供了丰富的API和事件机制,使得处理HTML变得简单。通过深入研究其源码,开发者可以更好地理解HTML解析的过程,提高程序的效率和准确性。配合提供的...

    HtmlParser笔记

    - "HtmlParser学习笔记总结.doc":对学习过程的总结,可能包含常见问题解答和最佳实践。 - "yanghaisheng.platform.htmlparser.rar":可能包含一个示例平台或项目,供用户实践和参考。 总之,HtmlParser是Java中一...

    htmlparser

    9. **学习与实践**:要深入理解和使用HTMLParser,需要掌握基本的HTML语法,熟悉DOM操作,以及理解如何通过编程语言(如Java)与解析器进行交互。实践是提高的关键,可以尝试解析一些实际的HTML文档,提取特定信息,...

    HTMLParser

    总结来说,HTMLParser是一个强大且灵活的HTML解析工具,适合处理各种HTML文档,特别是当需要在Java环境中进行HTML内容的解析和处理时,它提供了一种高效且无依赖的解决方案。通过阅读源码、文档以及使用提供的例子,...

    html解析的利器,htmlParser

    在众多的HTML解析工具中,`htmlParser`脱颖而出,以其易用性和高效性成为许多开发者的选择。本篇文章将深入探讨`htmlParser`这一...通过学习和熟练掌握`htmlParser`,开发者可以更高效地完成网页数据的抓取和处理任务。

    C#htmlparser及入门资料

    总结来说,C# HTMLParser是一个强大的工具,可以帮助开发者轻松地解析和操作HTML文档。通过熟悉它的API和方法,你可以有效地提取和处理网页中的信息。结合实际项目需求,不断探索和实践,你会发现HTMLParser在处理...

    开发资料下载 HTMLParser教程

    HTMLParser教程是一个面向开发者的学习资源,它主要涵盖了如何在编程中解析和处理HTML文档的核心概念。这个教程可能包括了Python的HTMLParser库的使用,也可能涉及其他编程语言中的类似库,如Java的jsoup或...

    HtmlParser爬取气象信息实例

    总结来说,HTMLParser爬取气象信息的实例展示了如何利用Python的内置解析器来提取网页中的特定信息。通过定义自定义的事件处理器,我们可以根据需要处理HTML文档中的元素,从而有效地获取和分析数据。结合其他工具,...

    htmlparser使用指南

    总结,HTMLParser是一个强大的HTML处理工具,其简洁的API和事件驱动模型使得处理HTML文档变得轻松。通过熟练掌握HTMLParser,开发者可以更高效地解析、提取和操作HTML数据,从而在Web开发中实现更多功能。

    由新水浒到htmlparser的一次运用

    标题“由新水浒到htmlparser的一次运用”暗示了这篇...同时,压缩包中的"HTMLParser+API.CHM"文件很可能是HTMLParser的API文档,包含了关于库的所有函数、方法和类的详细说明,是学习和使用HTMLParser的重要参考资料。

    Winista.Htmlparser

    总结来说,Winista.Htmlparser是一个针对C#开发者的高效网页解析工具,它提供了简单易用的API、优秀的性能以及丰富的自定义可能性。无论你是初次接触网页解析,还是有经验的开发者,这个类库都能帮助你轻松地处理...

    htmlparser:cpp htmlparser实现

    总结来说,"htmlparser:cpp htmlparser实现"是一个专注于在C++中解析HTML文档的库,它涉及到了HTML语法规则的理解、解析器设计模式的运用、内存管理、事件驱动编程、DOM树构建、错误处理、性能优化以及库的可扩展性...

    java 新浪网易搜狐新闻抓取源码

    总结,"java 新浪网易搜狐新闻抓取源码"项目展示了如何使用Java和HTMLParser库来实现新闻数据的抓取和处理。通过学习和实践这样的项目,开发者不仅可以掌握网页抓取的基本技能,还能深入理解HTTP协议、HTML解析以及...

    Python2.7学习文档

    - 对整个学习过程的回顾与总结,强调实践的重要性。 以上内容涵盖了Python 2.7学习文档中的主要知识点,为初学者提供了一个全面的学习框架。通过系统学习这些内容,不仅可以掌握Python的基本语法,还能深入理解其...

    一个专业搜索公司关于lucene+solar资料(2)

    根据提供的文档内容,我们可以总结出以下关键知识点,这些知识点主要围绕Lucene+Solr以及HtmlParser在正文提取方面的应用。 ### HtmlParser与ContentExtractor **HtmlParser简介:** HtmlParser是一个用于解析HTML...

    Python语法总结

    ### Python语法总结 #### 1. Python 3 ##### 1.1 数据类型 Python 提供了多种内置的数据类型,这些类型是理解任何 Python 程序的基础。 ###### 1.1.1 整数,浮点数,字符串,布尔值(True、False),空值(None...

    廖雪峰python3 完整带索引,图片 最新教程 pdf版

    刚刚学习Python, 边看廖神的教程边想着搞个离线版,用requests+beautifulsoup抓的。仅供学习用 Python教程 Python简介 安装Python Python解释器 第一个Python程序 使用文本编辑器 Python代码运行助手 ...期末总结

    基于 webmagic 的 Java 爬虫应用.zip

    通过查看和学习这个项目的源码,你可以了解到如何将WebMagic应用于实际的爬虫工程,如何组织项目结构,以及如何处理数据抓取过程中的各种问题,如反爬机制、数据清洗和存储等。 总结来说,"基于 webmagic 的 Java ...

Global site tag (gtag.js) - Google Analytics