`
dengminhui
  • 浏览: 167936 次
  • 来自: ...
社区版块
存档分类
最新评论

HtmlParser爬取气象信息实例

阅读更多

闲来无事,搞搞htmlParser,本想将内容发到手机上,后来未成,只是将杭州的天气情况拼装好了。

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class MyWeatherTest {

    private static final Logger        logger         = Logger.getLogger(MyWeatherTest.class);
    private static String              PARSE_CITY     = "杭州";
    private static String              CLASS_NODE     = "class";
    private static String              CLASS_CITY     = "w365";
    private static String              CLASS_DAY      = "everyDay";
    private static String              CLASS_DAY_ELSE = "everyDayelse";

    private static String              TEXT_MSG       = "$CITY明天$DATE$STATUS,温度为$$TMPT;后天$DATE$STATUS,温度为$TMPT   中央气象局 $LAST_MODIFY_TIME";
    private static Map<String, String> cityURLMap     = new HashMap();
    static {
        cityURLMap.put(PARSE_CITY, "http://www.nmc.gov.cn/publish/forecast/AZJ/hangzhou.html");
    }
    
    public static void main(String[] args) {
        Parser parser;
        NodeFilter filter;
        String text = TEXT_MSG.replaceFirst("\\$CITY", PARSE_CITY);
        int start = 1;
        Node[] nodes = new Node[2];
        
        try {
            // 如果当天的class为everyDayelse,则start值减1
            parser = new Parser(cityURLMap.get(PARSE_CITY));
            parser.setEncoding(parser.getEncoding());
            NodeFilter filterElse = new HasAttributeFilter(CLASS_NODE, CLASS_DAY_ELSE);
            if (parser.extractAllNodesThatMatch(filterElse).size() > 0) {
                start--;
            }

            // 取出后面两天的内容div
            parser = new Parser(cityURLMap.get(PARSE_CITY));
            parser.setEncoding(parser.getEncoding());
            filter = new HasAttributeFilter(CLASS_NODE, CLASS_DAY);
            NodeList list1 = parser.extractAllNodesThatMatch(filter);
            for (int i = 0; i < 2; i++) {
                nodes[i] = list1.elementAt(start);
                start++;
                // logger.fatal(list.elementAt(i).toHtml());
            }

            // 将内容
            for (int i = 0; i < 2; i++) {

                String content = nodes[i].toPlainTextString().replaceAll("[ ]|[\t]", "");
                
                //填充日期
                String[] str = content.split("\\\n");
                text = text.replaceFirst("\\$DATE", str[1]);
                
                //填充天气
                if (str[6].equals(str[7])) {
                    text = text.replaceFirst("\\$STATUS", str[6]);
                } else {
                    text = text.replaceFirst("\\$STATUS", str[6] + "转" + str[7]);
                }
                
                //填充温度
                if(str[8].contains("低温")){
                    text = text.replaceFirst("\\$TMPT", str[8].replace("高温", "").replace("低温", "-"));
                }else{
                    text = text.replaceFirst("\\$TMPT", str[8].replace("高温", "")+str[9].replace("低温", "-"));
                }

            }

            
            
            // 取出后面两天的内容div
            parser = new Parser(cityURLMap.get(PARSE_CITY));
            parser.setEncoding(parser.getEncoding());
            filter = new HasAttributeFilter(CLASS_NODE, CLASS_CITY);
            NodeList list2 = parser.extractAllNodesThatMatch(filter);
            for (int i = 0; i <list2.size(); i++) {
                String myStr=list2.elementAt(i).toPlainTextString().replaceAll("[ ]|[\t]|[\n]|[\\&nbsp;]", "");
                if(myStr.indexOf("最后更新时间")==0){
                    text = text.replaceFirst("\\$LAST_MODIFY_TIME", myStr);
                }
                   
            }
            

            System.out.println(text);
        } catch (ParserException e) {
            e.printStackTrace();
        }

    }
    
    

}

 可以跑起来,不过代码写得很烂,主要参考的是以下的代码:

import java.net.URL;

import junit.framework.TestCase;  
  
import org.apache.log4j.Logger;  
import org.htmlparser.Node;  
import org.htmlparser.NodeFilter;  
import org.htmlparser.Parser;  
import org.htmlparser.Tag;  
import org.htmlparser.beans.LinkBean;  
import org.htmlparser.filters.NodeClassFilter;  
import org.htmlparser.filters.OrFilter;  
import org.htmlparser.filters.TagNameFilter;  
import org.htmlparser.tags.HeadTag;  
import org.htmlparser.tags.ImageTag;  
import org.htmlparser.tags.InputTag;  
import org.htmlparser.tags.LinkTag;  
import org.htmlparser.tags.OptionTag;  
import org.htmlparser.tags.SelectTag;  
import org.htmlparser.tags.TableColumn;  
import org.htmlparser.tags.TableRow;  
import org.htmlparser.tags.TableTag;  
import org.htmlparser.tags.TitleTag;  
import org.htmlparser.util.NodeIterator;  
import org.htmlparser.util.NodeList;  
import org.htmlparser.util.ParserException;  
import org.htmlparser.visitors.HtmlPage;  
import org.htmlparser.visitors.NodeVisitor;  
import org.htmlparser.visitors.ObjectFindingVisitor;  
  
public class ParserTestCase extends TestCase {  
  
    private static final Logger logger = Logger.getLogger(ParserTestCase.class);  
  
    public ParserTestCase(String name) {  
        super(name);  
    }  
    /* 
     * 测试ObjectFindVisitor的用法 
     */  
    public void testImageVisitor() {  
        try {  
            ImageTag imgLink;  
            ObjectFindingVisitor visitor = new ObjectFindingVisitor(  
                    ImageTag.class);  
            Parser parser = new Parser();  
            parser.setURL("http://profile.china.alibaba.com/user/dengminhui12.html");  
            parser.setEncoding(parser.getEncoding());  
            parser.visitAllNodesWith(visitor);  
            Node[] nodes = visitor.getTags();  
            logger.fatal("result of testImageVisitor : size = " + nodes.length);  
            for (int i = 0; i < nodes.length; i++) {  
                imgLink = (ImageTag) nodes[i];  
                logger.fatal("testImageVisitor() ImageURL = "  
                        + imgLink.getImageURL()); 
            }  
        }  
        catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试TagNameFilter用法 
     */  
    public void testNodeFilter() {  
        try {  
            NodeFilter filter = new TagNameFilter("IMG");  
            Parser parser = new Parser();  
            parser.setURL("http://profile.china.alibaba.com/user/dengminhui12.html");  
            parser.setEncoding(parser.getEncoding());  
            NodeList list = parser.extractAllNodesThatMatch(filter);  
            logger.fatal("result of testNodeFilter : size = " + list.size()); 
            for (int i = 0; i < list.size(); i++) {  
                logger.fatal("testNodeFilter() " + list.elementAt(i).toHtml());  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
    /* 
     * 测试NodeClassFilter用法 
     */  
    public void testLinkTag() {  
        try {  
  
            NodeFilter filter = new NodeClassFilter(LinkTag.class);  
            Parser parser = new Parser();  
            parser.setURL("http://profile.china.alibaba.com/user/dengminhui12.html");  
            parser.setEncoding(parser.getEncoding());  
            NodeList list = parser.extractAllNodesThatMatch(filter);  
            logger.fatal("result of testLinkTag : size = " + list.size());  
            for (int i = 0; i < list.size(); i++) {  
                LinkTag node = (LinkTag) list.elementAt(i);  
                logger.fatal("testLinkTag() Link is :" + node.extractLink());  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
    /* 
     * 测试<link href=" text=’text/css’ rel=’stylesheet’ />用法 
     */  
    public void testLinkCSS() {  
        try {  
  
            Parser parser = new Parser();  
            parser  
                    .setInputHTML("<head><title>Link Test</title>"  
                            + "<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />"  
                            + "<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />"  
                            + "</head>" + "<body>");  
            parser.setEncoding(parser.getEncoding());  
            NodeList nodeList = null;  
  
            for (NodeIterator e = parser.elements(); e.hasMoreNodes();) {  
                Node node = e.nextNode();  
                logger  
                        .fatal("testLinkCSS()" + node.getText()  
                                + node.getClass());  
  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试OrFilter的用法 
     */  
    public void testOrFilter() {  
        NodeFilter inputFilter = new NodeClassFilter(InputTag.class);  
        NodeFilter selectFilter = new NodeClassFilter(SelectTag.class);  
        Parser myParser;  
        NodeList nodeList = null;  
  
        try {  
            Parser parser = new Parser();  
            parser  
                    .setInputHTML("<head><title>OrFilter Test</title>"  
                            + "<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />"  
                            + "<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />"  
                            + "</head>"  
                            + "<body>"  
                            + "<input type=’text’ value=’text1′ name=’text1′/>"  
                            + "<input type=’text’ value=’text2′ name=’text2′/>"  
                            + "<select><option id=’1′>1</option><option id=’2′>2</option><option id=’3′></option></select>"  
                            + "<a href=’http://www.yeeach.com’>yeeach.com</a>"  
                            + "</body>");  
  
            parser.setEncoding(parser.getEncoding());  
            OrFilter lastFilter = new OrFilter();  
            lastFilter.setPredicates(new NodeFilter[] { selectFilter,  
                    inputFilter });  
            nodeList = parser.parse(lastFilter);  
            for (int i = 0; i <= nodeList.size(); i++) {  
                if (nodeList.elementAt(i) instanceof InputTag) {  
                    InputTag tag = (InputTag) nodeList.elementAt(i);  
                    logger.fatal("OrFilter tag name is :" + tag.getTagName()  
                            + " ,tag value is:" + tag.getAttribute("value"));  
                }  
                if (nodeList.elementAt(i) instanceof SelectTag) {  
                    SelectTag tag = (SelectTag) nodeList.elementAt(i);  
                    NodeList list = tag.getChildren();  
  
                    for (int j = 0; j < list.size(); j++) {  
                        OptionTag option = (OptionTag) list.elementAt(j);  
                        logger  
                                .fatal("OrFilter Option"  
                                        + option.getOptionText());  
                    }  
  
                }  
            }  
  
        } catch (ParserException e) {  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试对<table><tr><td></td></tr></table>的解析 
     */  
    public void testTable() {  
        Parser myParser;  
        NodeList nodeList = null;  
        myParser = Parser.createParser("<body> " + "<table id=’table1′ >"  
                + "<tr><td>1-11</td><td>1-12</td><td>1-13</td>"  
                + "<tr><td>1-21</td><td>1-22</td><td>1-23</td>"  
                + "<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>"  
                + "<table id=’table2′ >"  
                + "<tr><td>2-11</td><td>2-12</td><td>2-13</td>"  
                + "<tr><td>2-21</td><td>2-22</td><td>2-23</td>"  
                + "<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>"  
                + "</body>", "GBK");  
        NodeFilter tableFilter = new NodeClassFilter(TableTag.class);  
        OrFilter lastFilter = new OrFilter();  
        lastFilter.setPredicates(new NodeFilter[] { tableFilter });  
        try {  
            nodeList = myParser.parse(lastFilter);  
            for (int i = 0; i <= nodeList.size(); i++) {  
                if (nodeList.elementAt(i) instanceof TableTag) {  
                    TableTag tag = (TableTag) nodeList.elementAt(i);  
                    TableRow[] rows = tag.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++) {  
                            logger.fatal("<td>" + td[k].toPlainTextString());  
                        }  
  
                    }  
  
                }  
            }  
  
        } catch (ParserException e) {  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试NodeVisitor的用法,遍历所有节点 
     */  
    public void testVisitorAll() {  
        try {  
            Parser parser = new Parser();  
            parser.setURL("http://profile.china.alibaba.com/user/dengminhui12.html");  
            parser.setEncoding(parser.getEncoding());  
            NodeVisitor visitor = new NodeVisitor() {  
                public void visitTag(Tag tag) {  
                    logger.fatal("testVisitorAll()  Tag name is :"  
                            + tag.getTagName() + " \n Class is :"  
                            + tag.getClass());  
                }  
  
            };  
  
            parser.visitAllNodesWith(visitor);  
        } catch (ParserException e) {  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试对指定Tag的NodeVisitor的用法 
     */  
    public void testTagVisitor() {  
        try {  
  
            Parser parser = new Parser(  
                    "<head><title>dddd</title>"  
                            + "<link href=’/test01/css.css’ text=’text/css’ rel=’stylesheet’ />"  
                            + "<link href=’/test02/css.css’ text=’text/css’ rel=’stylesheet’ />"  
                            + "</head>" + "<body>"  
                            + "<a id='hah' href=’http://www.yeeach.com’>yeeach.com</a>"  
                            + "</body>");  
            NodeVisitor visitor = new NodeVisitor() {  
                public void visitTag(Tag tag) {  
                    if (tag instanceof HeadTag) {  
                        logger.fatal("visitTag() HeadTag : Tag name is :"  
                                + tag.getTagName() + " \n Class is :"  
                                + tag.getClass() + "\n Text is :"  
                                + tag.getText());  
                    } else if (tag instanceof TitleTag) {  
                        logger.fatal("visitTag() TitleTag : Tag name is :"  
                                + tag.getTagName() + " \n Class is :"  
                                + tag.getClass() + "\n Text is :"  
                                + tag.getText());  
  
  
                    } else if (tag instanceof LinkTag) {  
                        logger.fatal("visitTag() LinkTag : Tag name is :"  
                                + tag.getTagName() + " \n Class is :"  
                                + tag.getClass() + "\n Text is :"  
                                + tag.getText() + " \n getAttribute is :"  
                                + tag.getAttribute("href"));  
                    } else {  
                        logger.fatal("visitTag() : Tag name is :"  
                                + tag.getTagName() + " \n Class is :"  
                                + tag.getClass() + "\n Text is :"  
                                + tag.getText());  
                    }  
  
                }  
  
            };  
  
            parser.visitAllNodesWith(visitor);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试HtmlPage的用法 
     */  
    public void testHtmlPage() {  
        String inputHTML = "<html>" + "<head>"  
                + "<title>Welcome to the HTMLParser website</title>"  
                + "</head>" + "<body>" + "Welcome to HTMLParser"  
                + "<table id=’table1′ >"  
                + "<tr><td>1-11</td><td>1-12</td><td>1-13</td>"  
                + "<tr><td>1-21</td><td>1-22</td><td>1-23</td>"  
                + "<tr><td>1-31</td><td>1-32</td><td>1-33</td></table>"  
                + "<table id=’table2′ >"  
                + "<tr><td>2-11</td><td>2-12</td><td>2-13</td>"  
                + "<tr><td>2-21</td><td>2-22</td><td>2-23</td>"  
                + "<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>"  
                + "</body>" + "</html>";  
        Parser parser = new Parser();  
        try {  
            parser.setInputHTML(inputHTML);  
            parser.setEncoding(parser.getURL());  
            HtmlPage page = new HtmlPage(parser);  
            parser.visitAllNodesWith(page);  
            logger.fatal("testHtmlPage -title is :" + page.getTitle());  
            NodeList list = page.getBody();  
  
            for (NodeIterator iterator = list.elements(); iterator  
                    .hasMoreNodes();) {  
                Node node = iterator.nextNode();  
                logger.fatal("testHtmlPage -node  is :" + node.toHtml());  
            }  
  
        } catch (ParserException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
    /* 
     * 测试LinkBean的用法 
     */  
    public void testLinkBean() {  
        Parser parser = new Parser();  
  
        LinkBean linkBean = new LinkBean();  
        linkBean.setURL("http://profile.china.alibaba.com/user/dengminhui12.html");  
        URL[] urls = linkBean.getLinks();  
  
        for (int i = 0; i < urls.length; i++) {  
            URL url = urls[i];  
            logger.fatal("testLinkBean() -url  is :" + url);  
        }  
  
    }  
  
} 
 

 

0
0
分享到:
评论

相关推荐

    HtmlParser 实现简易爬虫

    HTMLParser是一个Java库,用于解析HTML文档,提取和处理数据,这对于构建简易爬虫非常有用。...通过理解和熟练使用HTMLParser,开发者可以有效地抓取和处理大量网页数据,为数据分析、信息提取等应用场景提供支持。

    JAVA htmlparser 使用实例

    ### JAVA HtmlParser 使用实例详解 在Java开发过程中,解析HTML文档是一项常见的需求,尤其是在处理Web爬虫、数据抓取等应用场景时。`HtmlParser`库为开发者提供了一种简便的方式来解析HTML文档,并从中提取所需的...

    C# HtmlParser使用小实例

    通过阅读提供的`C# HtmlParser使用实例.doc`文档,你可以深入了解如何利用这个库来满足你的具体需求。同时,`winsta.Htmlparser.chm`帮助文档是宝贵的参考资料,包含了详细的API说明和技术细节。记住,理解并熟练...

    HtmlParser提取网页信息的设计与实现

    1. **初始化解析器**:首先创建HtmlParser实例。 2. **加载HTML文档**:将目标网页的HTML内容加载到解析器中。 3. **遍历节点**:遍历解析后的Node树,查找包含超链接信息的特定节点。 4. **提取链接信息**:从找到...

    C#正则+HTMLParser进行网页信息提取的实例。

    在这个实例中,我们将探讨如何结合C#中的正则表达式(Regular Expressions)和HTMLParser来高效地从网页中抓取所需数据。 首先,让我们了解什么是正则表达式。正则表达式是一种模式匹配工具,用于在字符串中查找、...

    Python爬虫实现爬取百度百科词条功能实例

    【Python爬虫实现爬取百度百科词条功能实例】 在Python编程中,爬虫是一种用于自动抓取互联网上信息的程序,常用于数据挖掘、搜索引擎优化和市场研究等领域。本实例主要讲解如何使用Python编写爬虫来抓取百度百科中...

    htmlparser

    META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans....

    HtmlParser

    使用HTMLParser,我们可以解析网页内容,提取所需信息,如文章标题、链接、图片等。以下是一些核心概念和步骤: 1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_...

    51job职位信息爬取器

    总的来说,【51job职位信息爬取器】是一个实用的工具,结合了Java编程、HTMLParser解析技术和网络爬虫策略,帮助用户高效地获取51job网站上的招聘信息。如果你对网络爬虫、数据抓取或者Java编程感兴趣,这是一个很好...

    基于HTMLParser的Web信息抽取系统的设计与实现

    基于HTMLParser的Web信息抽取系统的设计与实现,是一项旨在从网页中自动提取特定信息的技术方案。随着互联网信息的爆炸性增长,如何从海量数据中快速定位到有价值的信息成为了一个亟待解决的问题。传统的HTML页面...

    HTMLParser抽取Web网页正文信息.doc

    ### HTMLParser抽取Web网页正文信息的关键知识点 #### 一、HTMLParser简介与应用 HTMLParser是一种用于解析HTML文档的工具,特别适用于从Web网页中提取有用的信息。它能够有效地识别和解析HTML标签,帮助开发者从...

    htmlparser库与教程

    3. **解析HTML**:学习如何使用`HTMLParser`实例解析HTML字符串或从URL读取HTML内容。这通常涉及到创建`Parser`对象,然后调用`parse()`方法。 4. **遍历和访问HTML元素**:HTMLParser提供了对HTML文档节点的遍历...

    HTMLParser.net源代码HTMLParser.net使用demo

    HTMLParser.net是一个强大的.NET框架库,专为解析HTML文档...例如,如何创建一个解析器实例,如何使用CSS选择器选取元素,如何监听解析事件等。这些示例将帮助新手快速上手,同时对有经验的开发者也有一定的参考价值。

    htmlparser.jar文件

    HTMLParser.jar 文件是一个Java库...总的来说,HTMLParser.jar是一个强大的Java HTML解析库,适用于需要处理HTML数据的场景,如爬虫、信息提取或者自动化测试。正确地导入和使用这个库,可以大大简化对HTML文档的操作。

    htmlparser进行网页信息的抽取

    以下是对HTMLParser及其在网页信息抽取中应用的详细说明: 1. **HTMLParser基本概念**: - HTMLParser是一个开源的Java库,它提供了API来解析HTML文档,支持处理HTML标签、属性、文本等元素。 - 库中的主要类包括...

    htmlparser(c#,java)

    - 在C#中,HTMLParser通常通过创建一个解析器实例,然后对HTML字符串或流进行操作。例如,你可以使用`HtmlDocument`类来加载HTML内容,并通过`SelectNodes`方法来查询特定的HTML元素。 - 在Java中,类似地,你可以...

    c#版htmlparser htmlparser.dll htmlparser源代码

    在.NET环境中,开发者经常需要处理HTML数据,例如从网页抓取信息或者进行网页自动化。HTMLParser库提供了便捷的方式来解析复杂的HTML结构,提取所需的数据,而无需关心底层的DOM操作细节。 `htmlparser.dll`是这个...

Global site tag (gtag.js) - Google Analytics