简体   繁体   中英

unsupported format character?

I have the following code

import urllib.request

niveau_zoom_satellite = 0.0001389


def Image(coordinates, image_size, name):


    d1 = "http://eumetview.eumetsat.int/geoserv/wms?LAYERS=overlay%3Ane_10m_coastline%2Coverlay%3Ane_10m_admin_0_boundary_lines_land&STYLES=&TRANSPARENT=TRUE&FORMAT=image%2Fpng8&VERSION=1.3.0&TILED=true&EXCEPTIONS=INIMAGE&SERVICE=WMS&REQUEST=GetMap&CRS=EPSG%3A4326&BBOX=47.640001058578,3.520001411438,48.880001068115,4.7600014209747&WIDTH=256&HEIGHT=256" % \
               (niveau_zoom_satellite,
                coordinates[0],
                coordinates[1],
                image_size[0] / 2,
                image_size[1] / 2,
                image_size[0],
                image_size[1])
    for line in urllib.request.urlopen(d1):
        if line.startswith("<td align=left><input type=image src="):
            d2 = "http://http://eumetview.eumetsat.int/%s" % (line.split("\"")[1],)
            break
    urllib.request.urlretrieve(d2, name)


if __name__ == '__main__':
    Image((4.37337, 47.43572), (256, 256), "test.jpg")

and the problem is

ValueError: unsupported format character 'A' (0x41) at index 58

You use a URL as a format string for % operator. However, the URL contains several characters that are encoded as %xx , where xx is a hexadecimal code of the character (3A for colon : and 2F for slash / ). Those % characters are interpreted as beginnings of format specifications. You should either escape them by replacing single % with double %% to avoid interpretation by % operator, or get rid of the % operator altogether and use format method instead.

BTW, I don't see any actual format specifications in your string - what do you really want as value of d1 ?

Edit: so I'd guess the correct code is something like this:

d1 = "http://eumetview.eumetsat.int/geoserv/wms?LAYERS=overlay%3Ane_10m_coastline%2Coverlay%3Ane_10m_admin_0_boundary_lines_land&STYLES=&TRANSPARENT=TRUE&FORMAT=image%2Fpng8&VERSION=1.3.0&TILED=true&EXCEPTIONS=INIMAGE&SERVICE=WMS&REQUEST=GetMap&CRS=EPSG%3A4326&BBOX={},{},{},{}&WIDTH={}&HEIGHT={}".format(
    coordinates[0],
    coordinates[1],
    image_size[0] / 2,
    image_size[1] / 2,
    image_size[0],
    image_size[1])

I still don't know where niveau_zoom_satellite fits into this.

Its complaining about %3An in the d1 definition. Better to use str.format() here.

for example:

d1 = "www.blabla.com/{var1}asdasd".format(var1=5)

which will generate:

d1 = "www.blabla.com/5asdasd"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM