使用python中的post将数据发送到带变量的php

时间:2015-09-29 10:08:11

标签: php python date urllib2

我有这个脚本,我想用当前日期替换日期2015-05-01(从和到)。我正在考虑使用 import datetime 之类的东西(我是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

3 个答案:

答案 0 :(得分:1)

我并不是说听起来很苛刻,但对语言不熟悉并不是不学习语言语法的借口(恰恰相反)。这一行:

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

然后因为“&amp; ToDate”应该是一个字符串文字,而不是一个操作符和一个变量,你必须引用它:

"POSTDATA=FromDate=" + i + "&ToDate="

然后再次连接当前日期:

"POSTDATA=FromDate=" + i + "&ToDate=" + i + "etc..."

现在在您的代码中i(不是我将命名日期命名为BTW,但无论如何)是datetime对象,而不是字符串,所以现在您将获得TypeError因为你不能将一个字符串与一个字符串连接起来(希望 - 它没有任何意义)。

FWIW这里你想要的不是datetime对象,而是以“YYYY-MM-DD”格式表示日期的文本(“字符串”)。您可以使用datetime方法从strftime()对象获取此内容:

today = datetime.datetime.now().strftime("%Y-%m-%d)

现在你有了一个可以连接的字符串:

data = "POSTDATA=FromDate=" + today + "&ToDate=" + today + "etc..."

这就是说:

  • 这种操作通常使用string formatting
  • 完成
  • 正如Ekrem Dogan所提到的,这里最简单的解决方案是使用更高级别的包来处理HTTP请求的所有无聊细节 - requests是事实上的标准。

答案 1 :(得分:0)

忘记urlliburllib2个库。我建议您使用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 

答案 2 :(得分:0)

  

我想将日期2015-05-01(from和to)替换为当前日期

要替换日期,您可以使用字符串格式。发布请求并将响应打印到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数据,而不是手动执行。