使用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还多。。

原文地址:https://www.cnblogs.com/xiziyin/p/1685577.html