Issue 25253: AttributeError: 'Weather' object has no attribute 'dom' (original) (raw)

The source code for ctw (CurseTheWeather) can be found here: https://github.com/tdy/ctw

Running ctw USCA0987 or ctw --nometric USCA0987 (happens regardless of location) results in an attribute error with Python 3.4.3. Running ctw by itself does print a Welcome to "Curse the Weather" Version 0.6 message.

Traceback (most recent call last): File "/usr/bin/ctw", line 378, in curses.wrapper(main) File "/usr/lib/python3.4/curses/init.py", line 94, in wrapper return func(stdscr, *args, **kwds) File "/usr/bin/ctw", line 283, in main update(stdscr) File "/usr/bin/ctw", line 250, in update weather = weatherfeed.Weather(location, metric) File "/usr/lib/python3.4/weatherfeed.py", line 40, in init self.dom = parseString(self._getData()) File "/usr/lib/python3.4/xml/dom/minidom.py", line 1970, in parseString return expatbuilder.parseString(string) File "/usr/lib/python3.4/xml/dom/expatbuilder.py", line 925, in parseString return builder.parseString(string) File "/usr/lib/python3.4/xml/dom/expatbuilder.py", line 223, in parseString parser.Parse(string, True) xml.parsers.expat.ExpatError: not well-formed (invalid token): line 64, column 26 Exception ignored in: > Traceback (most recent call last): File "/usr/lib/python3.4/weatherfeed.py", line 44, in del self.dom.unlink() AttributeError: 'Weather' object has no attribute 'dom'

I did notice the API URL in weatherfeed.py gives a Bad Request error for:

urlHandle = urllib.request.urlopen('http://xoap.weather.com/weather/local/%s?cc=1&dayf=5&prod=xoap&link=xoap&unit=%s&par=1003666583&key=4128909340a9b2fc'

I also noticed the weather.com API now redirects to wunderground.com so I registered a new API and updated the URL in weatherfeed.py only to still get the same AttributeError.

The new API is something like http://api.wunderground.com/api/APIKEY/conditions/q/CA/San_Francisco.json

I don't think this is a bug of Python. You should check your own application to make sure you are parsing the right XML.

I run your code with the old uri and get the same traceback. The cause is you are using xml parser to parse a html document which is error prone, since the api is out-of-date and return a html document.

I don't know what happens about the new api since I have no KEY and can not do the experiment. But from the api you give, what you will retrieve is a json. Surly parse it with a xml parse leads to error and the attribute dom won't be created.