отправка данных с помощью post в python на php с переменной

У меня есть этот сценарий, и я хочу заменить дату 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

0

Решение

Я не хочу показаться грубым, но новость в языке не освобождает от ответственности за то, что он не изучает синтаксис языка (совсем наоборот). Эта строка:

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..."

Это как говорится:

  • этот вид операции обычно выполняется с использованием форматирование строки
  • и, как упоминал Экрем Доган, самое простое решение здесь — использовать пакет более высокого уровня, который позаботится обо всех скучных деталях HTTP-запросов — requests будучи стандартом де-факто.
1

Другие решения

забывать 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
0

Я хочу заменить дату 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 данные вместо того, чтобы делать это вручную.

0
По вопросам рекламы [email protected]