最近搞个点餐系统,需要有些吃的信息,懒得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(" ", "").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还多。。