• 使用html parser解析网页


    最近搞个点餐系统,需要有些吃的信息,懒得copy+paste,写个简单的爬虫捞点数据,呵呵。

    html parser解析网页
    package com.taobao.et.tea.collection;

    import org.htmlparser.Node;
    import org.htmlparser.NodeFilter;
    import org.htmlparser.Parser;
    import org.htmlparser.filters.CssSelectorNodeFilter;
    import org.htmlparser.filters.StringFilter;
    import org.htmlparser.filters.TagNameFilter;
    import org.htmlparser.nodes.RemarkNode;
    import org.htmlparser.nodes.TagNode;
    import org.htmlparser.nodes.TextNode;
    import org.htmlparser.util.NodeList;
    import org.htmlparser.util.ParserException;
    import org.htmlparser.util.SimpleNodeIterator;
    import org.htmlparser.visitors.HtmlPage;
    import org.htmlparser.visitors.TagFindingVisitor;

    /**
    *
    @author <a href="mailto:czy88840616@gmail.com">czy</a>
    *
    @since 2010-3-8 21:59:12
    */
    public class HtmlParserTest {
    public static void main(String[] args) {
    String url
    = "http://www.fan007.com/shop/1719/1008";
    try {
    Parser parser
    = new Parser(url);
    HtmlPage vistor
    = new HtmlPage(parser);
    parser.visitAllNodesWith(vistor);
    NodeList body
    = vistor.getBody();
    //解析基本信息
    parseTitleInfo(body);
    //解析产品和分类
    parseProduct(body);

    }
    catch (ParserException e) {
    //logger
    } catch (Exception e) {
    //logger
    }
    }

    /**
    * 解析产品和分类
    *
    *
    @param body of type NodeList
    */
    private static void parseProduct(NodeList nodeList) throws ParserException {
    NodeFilter filter
    = new CssSelectorNodeFilter(".ct_food");
    NodeList allProductList
    = nodeList.extractAllNodesThatMatch(filter, true).elementAt(0).getChildren();

    SimpleNodeIterator simpleNodeIterator
    = allProductList.elements();
    while (simpleNodeIterator.hasMoreNodes()) {
    Node node
    = simpleNodeIterator.nextNode();
    //过滤包含回车和tab的文本节点和注释节点
    if(node instanceof TextNode || node instanceof RemarkNode) {
    continue;
    }
    TagNode tagNode
    = (TagNode)node;
    //取得class的值
    String className = tagNode.getAttribute("class");
    //这是类别的class
    if(className.equals("cp_kind")) {
    System.out.println(
    "类别:"+tagNode.getChildren().elementAt(3).toPlainTextString().trim());
    }
    else {
    //具体产品
    String productString = tagNode.toPlainTextString().trim();
    String[] strings
    = productString.split("");
    String productName
    = strings[0].replace("&nbsp;", "").trim();
    String productMoney
    = strings[1].trim();
    System.out.println(
    "产品:"+productName+",价格:"+productMoney);
    }
    }
    }

    /**
    * 解析基本的信息
    *
    *
    @param nodeList of type NodeList
    *
    @throws ParserException when
    */
    public static void parseTitleInfo(NodeList nodeList) throws ParserException {
    //取shop信息
    NodeFilter filter = new CssSelectorNodeFilter(".ct_info");
    NodeList titleNode
    = nodeList.extractAllNodesThatMatch(filter, true);

    System.out.println(
    "店名:"+
    titleNode.extractAllNodesThatMatch(
    new CssSelectorNodeFilter(".bulname"), true).asString().trim());
    System.out.println(
    "简介:"+selectMainInfoByBeforeNode(titleNode, "餐厅简介"));
    System.out.println(
    "电话:"+selectMainInfoByBeforeNode(titleNode, "服务电话"));
    System.out.println(
    "地址:"+selectMainInfoByBeforeNode(titleNode, "地址"));
    System.out.println(
    "备注:"+titleNode.extractAllNodesThatMatch(new CssSelectorNodeFilter(".caution"), true).asString().trim());

    }

    /**
    * 根据要查询的字符串,查询跟它相邻的值节点,返回该节点的值
    *
    *
    @param totalList of type NodeList
    *
    @param parseString of type String
    *
    @return String
    */
    private static String selectMainInfoByBeforeNode(NodeList totalList, String parseString) {
    Node node
    = totalList.extractAllNodesThatMatch(new StringFilter(parseString), true).elementAt(0).getParent();
    return node.getNextSibling().getNextSibling().toPlainTextString().trim();
    }
    }

    解析结果:

    结果
    店名:星期六便利餐厅(文一店)
    简介:每周七天,星期六便利餐厅每天都为您准备了不同口味和搭配的组合供您选择。
    电话:88854900 / 13738031100
    地址:文一路441号
    备注:2份起送 ,只经营 午餐, 下午茶, 晚餐 。
    类别:蛋包饭
    产品:萍果蛋包饭,价格:7.0
    产品:香芋蛋包饭,价格:7.0
    产品:菠萝蛋包饭,价格:9.0
    产品:原味蛋包饭,价格:9.0
    产品:香橙蛋包饭,价格:10.0
    产品:茄汁鸡肉蛋包饭,价格:13.0
    类别:饭类
    产品:阿里山肉片饭,价格:7.0
    产品:梅干菜烧肉饭,价格:7.0
    产品:火腿蛋炒饭,价格:8.0
    产品:腊肉丝瓜饭,价格:8.0
    产品:青江猪柳饭,价格:8.0
    产品:番茄鸡肉盖饭,价格:10.0
    产品:牛肉盖饭,价格:10.0
    产品:台式糖醋排骨饭,价格:10.0
    产品:鲜菇青花煨鸡饭,价格:10.0
    产品:香脆猪排饭,价格:10.0
    产品:蔬菜烧肉饭,价格:11.0
    产品:香芋蒸肉饭,价格:11.0
    产品:番茄排骨饭,价格:12.0
    产品:黑椒猪排饭,价格:12.0
    产品:麻辣烤肉饭,价格:12.0
    产品:青江牛柳饭,价格:12.0
    产品:酱煮排骨饭,价格:13.0
    产品:蘑菇奶香烩猪丁饭,价格:13.0
    产品:奶香腊味白菜饭,价格:13.0
    产品:三宝饭,价格:13.0
    产品:鲜翠荷兰豆烧肉饭,价格:13.0
    产品:黑椒牛柳饭,价格:14.0
    产品:椒香鸡腿饭,价格:14.0
    产品:蘑菇奶香烩鸡饭,价格:14.0
    产品:铁板炖牛肉饭,价格:14.0
    产品:一品嫩烧鸡腿饭,价格:14.0
    类别:面类
    产品:清炖鸡丝面,价格:6.0
    产品:香辣鸡丝面,价格:6.0
    产品:红烧牛肉面,价格:8.0
    产品:平阳式炒粉干,价格:8.0
    产品:香辣牛肉面,价格:8.0
    产品:大排面,价格:10.0
    产品:铁板炒乌龙面,价格:12.0
    产品:意大利肉酱面,价格:13.0
    产品:泰式香辣鸡肉面,价格:14.0
    类别:沙冰
    产品:草莓牛奶冰,价格:4.0
    产品:红豆牛奶冰,价格:4.0
    产品:花生牛奶冰,价格:4.0
    产品:酸梅冰,价格:4.0
    类别:甜汤
    产品:红豆汤,价格:2.0
    产品:酒酿小丸子,价格:4.0
    产品:红枣花生牛奶汤,价格:5.0
    类别:小食小菜
    产品:荷包蛋,价格:2.0
    产品:咸鸭蛋,价格:2.5
    产品:酱瓜毛豆,价格:3.0
    产品:芹菜豆芽,价格:3.0
    产品:葱花蛋,价格:4.0
    产品:海带结,价格:4.0
    产品:凉拌多宝菜,价格:4.0
    产品:摩客斯多宝菜,价格:4.0
    产品:上汤馄饨,价格:4.0
    产品:土豆丝炒肉,价格:4.0
    产品:油爆虾米,价格:4.0
    产品:摩客斯烤对翅,价格:5.0
    产品:泡椒凤爪,价格:5.0
    产品:蒜香包心菜,价格:5.0
    产品:蒜香小青菜,价格:5.0
    产品:田园煎饺,价格:5.0
    产品:芝香鸡块,价格:5.0
    产品:美味鸭肫,价格:6.0
    产品:田园汤饺,价格:6.0
    产品:炸洋葱圈,价格:6.0
    类别:饮料
    产品:梅子绿茶,价格:3.0
    产品:茉香绿茶,价格:3.0
    产品:珍珠奶茶,价格:3.0
    产品:橙汁,价格:4.0
    产品:热巧克力,价格:4.0
    产品:巧克力牛奶,价格:5.0
    产品:热牛奶,价格:5.0

    PS:怎么发现写程序的时间比直接copy还多。。

  • 相关阅读:
    javascript之数组去重方法
    经典问题之爬楼梯
    javascript之事件循环机制
    javascript之闭包
    javascript之动态改变this上下文
    块级元素的垂直居中对齐
    js数组对象
    javascript-冒泡法排序
    javascript-数组
    javascript-循环
  • 原文地址:https://www.cnblogs.com/xiziyin/p/1685577.html
Copyright © 2020-2023  润新知