You might be better off using bread\bwrite in the sockread and the file handling commands to parse it.
Code:
on *:text:!weather *:#:{
  if $sock(weather) { msg # A weather search is already in progress. | return }
  set %weather.zip $2
  set %weather.chan $chan
  weather
}
alias weather {
  write -c E:\weather.txt
  sockopen weather weatherforyou.com 80
}
on *:sockread:weather:{
  if $sockerr { echo -a * $!sockerr ( $+ $sockname $+ ): $sock($sockname).wsmsg | return }
  sockread -f &weather
  bwrite E:\weather.txt -1 -1 &weather
}
on *:sockclose:weather:{
  if $file(E:\weather.txt) { weather.parse }
}
alias weather.parse {
  var %loc,%tmp,%hum,%dew
  .fopen w E:\weather.txt
  .fseek -w w *was not found*
  if !$feof { msg %weather.chan * Weather: Location $+([,%weather.zip,]) not found. | .fclose w | return }
  else .fseek w 0
  .fseek -w w *Reported at*
  %loc = $gettok($gettok($gettok($fread(w),2,62),1,60),3-,32)
  .fseek -w w *°f*
  %tmp = $replace($gettok($gettok($fread(w),3,62),1,60),°,°)
  .fseek -w w *Humidity:* | .echo -q $fread(w)
  %hum = $gettok($gettok($fread(w),2,62),1,60)
  .fseek -w w *Dewpoint* | .echo -q $fread(w)
  %dew = $replace($gettok($gettok($fread(w),2,62),1,60),°,°)
  .fclose w
  msg %weather.chan * Weather for %loc Current: %tmp Humidity: %hum Dewpoint: %dew
  unset %weather.*
}
on *:sockopen:weather:{
  if $sockerr { echo -a * $!sockerr ( $+ $sockname $+ ): $sock($sockname).wsmsg | return }
  sockwrite -n $sockname GET /cgi-bin/hw3/hw3.cgi?forecast=zandh&pands= $+ %weather.zip $+ &Submit=Get+Forecast HTTP/1.1
  sockwrite -n $sockname Host: weatherforyou.com $+ $crlf $+ $crlf
}