使用htmlparser获取sohu的天气预报

来源:互联网 发布:手机开通淘宝网店步骤 编辑:程序博客网 时间:2024/04/29 00:59

首先,我们新建一个类,存放天气信息

/*
 * Created on 2005-3-8
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package org.exoplatform.portlets.chinaweather.component;

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Weather {
 private String city;
 private String state;
 private String temperature;
 private String time;
 private String wind;
 private String windpower;
 private long UpdateTime;

 /**
  * @return
  */
 public String getTemperature() {
  return temperature;
 }

 /**
  * @return
  */
 public String getTime() {
  return time;
 }

 /**
  * @return
  */
 public String getWind() {
  return wind;
 }

 /**
  * @return
  */
 public String getWindpower() {
  return windpower;
 }

 /**
  * @param string
  */
 public void setTemperature(String string) {
  temperature = string;
 }

 /**
  * @param string
  */
 public void setTime(String string) {
  time = string;
 }

 /**
  * @param string
  */
 public void setWind(String string) {
  wind = string;
 }

 /**
  * @param string
  */
 public void setWindpower(String string) {
  windpower = string;
 }

 /**
  * @return
  */
 public long getUpdateTime() {
  return UpdateTime;
 }

 /**
  * @param l
  */
 public void setUpdateTime(long l) {
  UpdateTime = l;
 }

 /**
  * @return
  */
 public String getState() {
  return state;
 }

 /**
  * @param string
  */
 public void setState(String string) {
  state = string;
 }

 /**
  * @return
  */
 public String getCity() {
  return city;
 }

 /**
  * @param string
  */
 public void setCity(String string) {
  city = string;
 }

}

具体的解析代码为:

private Weather parserWeather() throws Exception {
  Weather w = new Weather();
  try {

   //Parser parser =
   // new Parser("file://localhost/I:/projects/query.html");
   Parser parser =
    new Parser("http://weather.news.sohu.com/query.php?city=镇江");
   
   parser.setEncoding("GBK");
   Node nodes[] = parser.extractAllNodesThatAre(TableTag.class);

   TableTag table = (TableTag) nodes[3];
   //temperature
   StringNode[] stringNodes = table.digupStringNode("镇江");
   StringNode name = stringNodes[0];
   w.setCity(name.toPlainTextString());
   CompositeTag td = (CompositeTag) name.getParent();
   CompositeTag tr = (CompositeTag) td.getParent();
   int columnNo = tr.findPositionOf(td);
   TableColumn nextColumn = (TableColumn) tr.childAt(5);
   Node expectedName = nextColumn.childAt(0);
   Node expectedName2 = nextColumn.childAt(2);
   //System.out.println(expectedName.getText());
   //System.out.println(expectedName2.getText());
   w.setState(expectedName.getText());
   w.setTemperature(expectedName2.getText());
   //time
   stringNodes = table.digupStringNode("时间");
   name = stringNodes[0];
   //System.out.println(name.toPlainTextString());

   String time =
    name
     .toPlainTextString()
     .substring(4, name.toPlainTextString().length())
     .trim();
   //System.out.println(time);
   w.setTime(time);
   //wind
   stringNodes = table.digupStringNode("风向");
   name = stringNodes[0];
   //System.out.println(name.toPlainTextString());

   String wind =
    name
     .toPlainTextString()
     .substring(4, name.toPlainTextString().length())
     .trim();
   //System.out.println(wind);
   w.setWind(wind);
   //wind power
   stringNodes = table.digupStringNode("风力");
   name = stringNodes[0];
   //System.out.println(name.toPlainTextString());

   String windpower =
    name
     .toPlainTextString()
     .substring(4, name.toPlainTextString().length())
     .trim();
   //System.out.println(windpower);
   w.setWindpower(windpower);

   w.setUpdateTime(System.currentTimeMillis());

  } catch (ParserException e) {

   e.printStackTrace();
  }
  return w;
 }

解析出来的代码必须做缓存处理,

private static long TIME_TO_LIVE = 1000 * 60 * 60 * 12;

 private Weather loadWeather() throws Exception {
  Weather weather = weather = (Weather) cache_.get("chinaweather");
  long currentTime = System.currentTimeMillis();
  if (weather != null
   && currentTime < (weather.getUpdateTime() + TIME_TO_LIVE)) {
   cache_.remove("chinaweather");
   weather = null;
  }

  if (weather == null) {
   synchronized (cache_) {
    weather = parserWeather();
    cache_.put("chinaweather", weather);
   }
  }

  return weather;
 }



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=314704


原创粉丝点击