У меня есть этот сценарий, и я хочу заменить дату 2015-05-01
(от и до) с текущей датой. Я думаю об использовании дата импорта время и как-то так (я новичок в python):
from StringIO import StringIO
import urllib
import urllib2
url = 'http://fme.discomap.eea.europa.eu/fmedatastreaming/AirQuality/AirQualityUTDExport.fmw'
data = "POSTDATA=FromDate=2015-05-01&ToDate=2015-06-01&Countrycode=&InsertedSinceDate=&UpdatedSinceDate=&Pollutant=PM10&Namespace=&Format=XML&UserToken= "req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
Новый скрипт
from StringIO import StringIO
import urllib
import urllib2
import datetime
i = datetime.datetime.now() // gets the date
url = 'http://fme.discomap.eea.europa.eu/fmedatastreaming/AirQuality/AirQualityUTDExport.fmw'
data = "POSTDATA=FromDate="i&ToDate="i"&Countrycode=&InsertedSinceDate=&UpdatedSinceDate=&Pollutant=PM10&Namespace=&Format=XML&UserToken=" //i replaced the fixed date with the variable i
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
Я не хочу показаться грубым, но новость в языке не освобождает от ответственности за то, что он не изучает синтаксис языка (совсем наоборот). Эта строка:
data = "POSTDATA=FromDate="i&ToDate="i"&Countrycode=&InsertedSinceDate=&UpdatedSinceDate=&Pollutant=PM10&Namespace=&Format=XML&UserToken="
очевидно сломан и вызывает ошибку SyntaxError:
bruno@bigb:~/Work/playground$ python
Python 2.7.3 (default, Jun 22 2015, 19:33:41)
>>> data = "POSTDATA=FromDate="i&ToDate="i"&Countrycode=&InsertedSinceDate=&UpdatedSinceDate=&Pollutant=PM10&Namespace=&Format=XML&UserToken="File "<stdin>", line 1
data = "POSTDATA=FromDate="i&ToDate="i"&Countrycode=&InsertedSinceDate=&UpdatedSinceDate=&Pollutant=PM10&Namespace=&Format=XML&UserToken="^
SyntaxError: invalid syntax
>>>
В этом утверждении выражение rhs фактически начинается с:
"POSTDATA=FromDate="
которая является допустимой литеральной строкойi&ToDate
который анализируется как «i
«(идентификатор)»&
«(оператор)»ToDate
«(идентификатор)Простое сопоставление буквенной строки и идентификатора (без оператора) на самом деле недопустимо:
bruno@bigb:~/Work/playground$ python
Python 2.7.3 (default, Jun 22 2015, 19:33:41)
>>> i = 42
>>> "foo" i
File "<stdin>", line 1
"foo" i
^
SyntaxError: invalid syntax
>>>
Очевидно, что вы хотите здесь, это конкатенация строк, которая выражается add
(»+
оператор), поэтому следует читать:
"POSTDATA=FromDate=" + i
Тогда с тех пор&ToDate «должен быть строковым литералом, а не оператором и переменной, которую вы должны заключить в кавычки:
"POSTDATA=FromDate=" + i + "&ToDate="
Затем снова объедините текущую дату:
"POSTDATA=FromDate=" + i + "&ToDate=" + i + "etc..."
Теперь в вашем коде i
(не так, как я бы назвал дату, кстати, но в любом случае) является datetime
объект, а не строка, так что теперь вы получите TypeError
потому что вы не можете объединить строку с чем-либо, кроме строки (надеюсь — это не имеет никакого смысла).
FWIW, что вы хотите здесь не datetime
объект, но текстовое («строковое») представление даты в формате «ГГГГ-ММ-ДД». Вы можете получить это от datetime
объект, использующий это strftime()
метод:
today = datetime.datetime.now().strftime("%Y-%m-%d)
Теперь у вас есть строка, которую вы можете объединить:
data = "POSTDATA=FromDate=" + today + "&ToDate=" + today + "etc..."
Это как говорится:
requests
будучи стандартом де-факто. забывать urllib
а также urllib2
библиотеки. Я рекомендую вам использовать requests
библиотека.
Здесь решение вашей проблемы с помощью requests
библиотека:
import requests, datetime
url = 'http://fme.discomap.eea.europa.eu/fmedatastreaming/AirQuality/AirQualityUTDExport.fmw'
i = datetime.datetime.now()
# add as many parameters as you like
payload = {'FromDate': i, 'ToDate': i, 'Pollutant': 'PM10', 'Format': 'XML'}
# here's the magic happens
r = requests.get(url, params=payload)
# status code of response
print r.status_code
# response text
print r.text
Я хочу заменить дату 2015-05-01 (с и по) на текущую дату
Чтобы заменить дату, вы можете использовать форматирование строки. Чтобы опубликовать запрос и распечатать ответ в stdout:
#!/usr/bin/env python2
import urllib2
import sys
from datetime import date
from contextlib import closing
from shutil import copyfileobj
from urllib import quote
url = 'http://fme.discomap.eea.europa.eu/fmedatastreaming/AirQuality/AirQualityUTDExport.fmw'
data = "POSTDATA=FromDate={now}&ToDate={now}".format(now=quote(date.today()))
data += "&Countrycode=&InsertedSinceDate=&UpdatedSinceDate=&Pollutant=PM10&Namespace=&Format=XML&UserToken="with closing(urllib2.urlopen(url, data)) as response:
copyfileobj(response, sys.stdout)
В общем, посмотрим urllib.urlencode()
, создавать application/x-www-form-urlencoded
данные вместо того, чтобы делать это вручную.