这个字符串如果不为空/不为null,解析到什么?

1 投票
1 回答
790 浏览
提问于 2025-04-18 17:01

我在使用Python.org的2.7 64位版本,系统是Windows Vista 64位。我有一些Scrapy的代码,它会按顺序发送一系列带有日期的XHR请求。在有结果的日期,我能顺利打印出我想要的输出。

但在没有数据的日期,我希望代码能打印出“No fixtures today: date”(其中的date是一个日期变量)。然而,如果elif条件不满足,什么也不会被打印出来。

我试过用“!= ''”和“== ''”,但结果还是一样。我只能猜测这是因为我在检查的字符串在没有数据返回的日期并没有变成空值。代码如下:

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) 代码真的解析成了其他非空值吗?

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 个回答

2

ast 模块中导入 literal_eval

这个模块的目的是让你能更好地理解 Python 代码的抽象语法树。

ast 模块帮助 Python 应用程序处理 Python 抽象语法的树状结构。抽象语法本身可能会随着每个 Python 版本的更新而变化;这个模块可以帮助你以编程的方式了解当前的语法结构是什么样的。

literal_eval:

安全地评估一个表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 字面量结构组成:字符串、数字、元组、列表、字典、布尔值和 None。

但是你传入的是通过 http 从远程服务器下载的 HTML 内容!这不是 Python 源代码,如果你希望它包含 Python 源代码,你必须先将其从你找到的任何容器中解包出来。一旦你这样做了,请注意,剩下的代码可能会有严重的安全问题。


这里有一个可以缓解你遇到的问题的方法。你可能应该先查看 response.content 中的内容,并考虑解析它(可能结合使用 re.searchsplitint()float()list())。

try:
    fixtures = literal_eval(response.content)
    handle_fixtures(fixtures)
    time.sleep(1)
except SyntaxError:
    # unfortunately using this method it's impossible to 
    # distinguish "no data" from "invalid data"
    print "No Fixtures Today: " + date
    time.sleep(1)

def handle_fixtures(fixtures):
    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 

撰写回答