如果该字符串不为空/ null,则该字符串解析为什么?

时间:2014-08-12 15:37:00

标签: python scrapy

我在Windows Vista 64位上使用Python.org版本2.7 64位。我有一些Scrapy代码按顺序提交一系列带日期标记的XHR请求。在返回结果的日期,我可以毫无问题地打印出我想要的输出。

在没有数据的日子里,我想要打印代码"今天没有固定装置:日期" (日期是日期变量。但是如果不符合elif条件,则不会打印任何内容。

我尝试过使用"!=''"和" ==''"相反,但我得到了相同的结果。我只能假设这是因为我正在评估的字符串在没有返回数据的日子里没有解析为空/ null。代码在这里:

from datetime import date, timedelta as td
from ast import literal_eval
from datetime import datetime
import requests
import time
import re

d1 = date(2013,11,01)
d2 = date(2014,5,31)

delta = d2 - d1


for i in range(delta.days + 1):
    time1 =  str(d1 + td(days=i))
    time2 = time1.split("-", 1)[0]
    time3 = time1.split("-", -1)[1]
    time4 = time1.rsplit("-", 1)[-1]

    time2 = int(time2)
    time3 = int(time3)
    time4 = int(time4)

    date = datetime(year=time2, month=time3, day=time4)


    url = 'http://www.whoscored.com/tournamentsfeed/8273/Fixtures/'

    params = {'d': date.strftime('%Y%m%d'), 'isAggregate': 'false'}
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}

    response = requests.get(url, params=params, headers=headers)

    try:
        fixtures = literal_eval(response.content)
        fixtures = str(fixtures)

        if fixtures is not None:

            fixtures = re.sub("\[", '', fixtures)
            fixtures = re.sub("\], ", ',\n', fixtures)
            fixtures = re.sub("\'", '', fixtures)
            fixtures = re.sub("\]", '', fixtures)

            print fixtures 
            time.sleep(1)

        elif fixtures is None:

           print "No Fixtures Today: " + date
           time.sleep(1) 

    except SyntaxError:

        pass
        time.sleep(1)

有人可以告诉我是否:

1)代码实际上正在解析为empty / null

以外的其他东西

2)我需要将此代码指向任何变量' fixtures'如果当天没有返回数据,它会解析。

由于

**

编辑:

**

下面的评论部分,如果删除了except语句,代码将返回此错误,我被告知是因为它正在解析HTML而不是语法实际上是无效的:

Traceback (most recent call last):
  File "C:\Python27\newtets\newtets\spiders\test3.py", line 32, in <module>
    fixtures = literal_eval(response.content)
  File "C:\Python27\lib\ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "C:\Python27\lib\ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    ^
SyntaxError: invalid syntax

由于这已经成为我原来问题得到解答的阻碍因素,我现在还要问:

1)为什么在这个实例中抛出了语法错误 2)对此进行编码的另一种方法是什么?

1 个答案:

答案 0 :(得分:1)

from ast import literal_eval

此模块旨在为您提供Python语法的抽象语法树上的内省功能。

  

ast模块帮助Python应用程序处理Python抽象语法语法的树。每个Python版本的抽象语法本身都可能会改变;这个模块有助于以编程方式找出当前语法的样子。

literal_eval

  

安全地评估表达式节点或包含Python的字符串       表达。提供的字符串或节点可能仅包含以下内容       Python文字结构:字符串,数字,元组,列表,dicts,布尔值,       没有。

但是您已经通过http传递了从远程服务器下载的HTML内容!它不是python源代码,如果你希望它包含python源代码,你必须先从你在那里找到的容器中解开它。一旦你这样做,请注意你的代码可能存在严重的安全问题。


这是一种可以缓解您遇到的问题的机制。您应该查看response.content中的内容并考虑解析它(可能是re.search / split / int()float()和{的某种组合{1}})。

list()