문제

I want to get the temperature and time from the following file:

<rss xmlns:georss="http://www.georss.org/georss" version="2.0">
<channel>
<title>Observations from Tunkhannock, PA - USA</title>
<link>
http://weather.weatherbug.com/PA/Tunkhannock-weather.html?ZCode=Z5546&Units=0&stat=TNKCN
</link>
<description>
Weatherbug, the owner of the world's largest weather network is now providing an API to it's weather data in the form of RSS. This will enable it's enthusiastic users to build their own applications.
</description>
<language>en-us</language>
<lastBuildDate>Sat, 05 Jan 2013 01:00:00 GMT</lastBuildDate>
<ttl>60</ttl>
<aws:weather xmlns:aws="http://www.aws.com/aws">
<aws:api version="2.0"/>
<aws:WebURL>
http://weather.weatherbug.com/PA/Tunkhannock-weather.html?ZCode=Z5546&Units=0&stat=TNKCN
</aws:WebURL>
<aws:InputLocationURL>
http://weather.weatherbug.com/PA/Tunkhannock-weather.html?ZCode=Z5546&Units=0
</aws:InputLocationURL>
<aws:station requestedID="" id="TNKCN" name="Tunkhannock HS" city="Tunkhannock" state=" PA" zipcode="18657" country="USA" latitude="41.5663871765137" longitude="-75.9794464111328"/>
<aws:current-condition icon="http://deskwx.weatherbug.com/images/Forecast/icons/cond002.gif">Partly Cloudy</aws:current-condition>
<aws:temp units="&deg;F">30.3</aws:temp>
<aws:rain-today units=""">0</aws:rain-today>
<aws:wind-speed units="mph">1</aws:wind-speed>
<aws:wind-direction>WNW</aws:wind-direction>
<aws:gust-speed units="mph">20</aws:gust-speed>
<aws:gust-direction>WNW</aws:gust-direction>
</aws:weather>
<image>
<title>Local Weather from WeatherBug</title>
<width>142</width>
<height>18</height>
<link>
http://weather.weatherbug.com/PA/Tunkhannock-weather.html?ZCode=Z5546&Units=0&stat=TNKCN
</link>
<url>
http://www.weatherbug.com/aws/imagesHmPg0604/img_wxbug_logo_whiteBG.gif
</url>
</image>
<item>
<title>Live Conditions from Tunkhannock, PA - USA</title>
<link>
http://weather.weatherbug.com/PA/Tunkhannock-weather.html?ZCode=Z5546&Units=0&stat=TNKCN
</link>
<pubDate>Sat, 05 Jan 2013 01:54:00 GMT</pubDate>
<description>
<![CDATA[
<img src="http://deskwx.weatherbug.com/images/Forecast/icons/cond002.gif" border="0" alt="Current Conditions"/>&nbsp;&nbsp;&nbsp;
 <b>Partly Cloudy</b> <br />

 <b>Temperature:</b> 30.3 &deg;F&nbsp;&nbsp;    
 <br />
 <b>Wind Speed:</b> 1 mph WNW&nbsp;&nbsp;
 <br /> 
 <b>Gusts:</b> 20 mph WNW &nbsp;&nbsp;
 <b>Rain Today:</b> 0 &quot; &nbsp;&nbsp;
 <br />
]]>
</description>
<georss:point>41.5663871765137 -75.9794464111328</georss:point>
<guid isPermaLink="false">Sat, 05 Jan 2013 01:54:21 GMT-Station1</guid>
</item>
</channel>
</rss

So the relevant data would be the lines:

<aws:temp units="&deg;F">30.3</aws:temp>

and

<pubDate>Sat, 05 Jan 2013 01:54:00 GMT</pubDate>

I've googled and fiddled for hours. I've tried feedparser as such:

import feedparser
d = feedparser.parse('http://api.wxbug.net/getLiveCompactWeatherRSS.aspx?ACode=A6787859817&zipcode=18657&unittype=0')

But doing

d.feed.temperature 

doesn't work (of course). And

d.feed.aws_temp

simply returns

{'units': u'&deg;F'}

In fact, when I do d.feed, there is no mention of the temperature in it. Can somebody point me in the right direction? I'm not familiar with python or feedparser so I'm confused as to why the actual temperature data (30.3 degrees) is not mentioned in d.feed.

Any suggestions are greatly appreciated!!

EDIT: BeautifulSoup seems like the way to go; I never encountered that while I was searching. Thanks again!

My question is: is this the preferred way of going about this? All I want to do is graph weather data using RRDTool. I use the temperature from WeatherBug because that is closest to my house. Is this the preferred way of doing that? Currently I have a very inefficient bash script that downloads the weatherbug webpage, greps for the right line, and cuts the data. It doesn't work well for the time because sometimes the data is more than 4 characters!

#/bin/bash
wget -q -O /home/colby/Scripts/conkyscripts/weather/fullPage "http://weather.weatherbug.com/PA/Tunkhannock-weather.html?zcode=z6286"

Time=`grep 'divObsTime' /home/colby/Scripts/conkyscripts/weather/fullPage | cut -c 41-49`

Temp=`grep -i 'divtemp' /home/colby/Scripts/conkyscripts/weather/fullPage | cut -c 59-62`

echo "As of $Time, it is $Temp"
도움이 되었습니까?

해결책

from BeautifulSoup import BeautifulSoup as Soup

file = 'data.xml'
handler = open(file).read()

soup = Soup(handler)

data = soup.find('aws:temp')
print data.text

FeedParser doesn't seem to handle the parsing very well, but this works:

import feedparser
import string

d = feedparser.parse(
    'http://api.wxbug.net/getLiveCompactWeatherRSS.aspx?ACode=A6787859817&zipcode=18657&unittype=0')

print str(d.feed['aws_weather']).translate(None, string.ascii_letters)

다른 팁

I got it:

import urllib
from BeautifulSoup import BeautifulSoup as Soup
>>> url='http://api.wxbug.net/getLiveCompactWeatherRSS.aspx?ACode=A6787859817&zipcode=18657&unittype=0'
>>> handler=urllib.urlopen(url).read()
>>> soup=Soup(handler)
>>> data=soup.find('aws:temp')
>>> print data
<aws:temp units="&deg;F">35.8</aws:temp>
>>> print data.text
35.8

Now my script reads as such:

import urllib
import sys
arg = sys.argv
from BeautifulSoup import BeautifulSoup as Soup
url='http://a6787859817.api.wxbug.net/getLiveWeatherRSS.aspx?ACode=A6787859817&zipCode=18657&OutputType=1'
handler=urllib.urlopen(url).read()
soup=Soup(handler)
temp=soup.find('aws:temp')
if "temp" in arg:
    print temp.text
d1=soup.find('aws:month')['number']
d2=soup.find('aws:day')['number']
d3=soup.find('aws:year')['number']
d4=soup.find('aws:hour')['number']
d5=soup.find('aws:minute')['number']
d6=soup.find('aws:am-pm')['abbrv']
mdy=d1+"/"+d2+"/"+d3
if "date" in arg:
    print mdy
hm=d4+":"+d5+" "+d6
if "hour" in arg:
    print hm

Works really, really great for Conky and shortly I will be experimenting with RRDTOOL

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top