【问题标题】:Printing multiple webpage items from json dictionary从 json 字典打印多个网页项目
【发布时间】:2014-07-31 18:04:41
【问题描述】:

我在 Windows Vista 64 位上使用 Python.org 版本 2.7 64 位。我有以下代码从嵌入在代码中引用的页面的 HTML 中的 javascript 'Datastore.prime' 项中提取数据:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.utils.markup import remove_tags
from scrapy.cmdline import execute
import csv
import re
import json

filepath = "C:\\Python27\\Football Data\\test" + ".txt"

with open(filepath, "w") as f:
    f.write("")
    f.close()

class MySpider(Spider):

    name = "goal2"
    allowed_domains = ["whoscored.com"]
    start_urls = ["http://www.whoscored.com/Teams/705/Archive/Israel-Maccabi-Haifa"]      

    def parse(self, response):

        playerdata = re.search(re.escape("DataStore.prime('stage-player-stat', defaultTeamPlayerStatsConfigParams.defaultParams , ") + '(\[.*\])' + re.escape(");"), response.body).group(1)

        for player in json.loads(playerdata):
            print player['FirstName']

这很好用,并给出了页面主表中包含的所有玩家名字的列表。但是,当我尝试通过将打印语句修改为 'print ['FirstName', 'LastName'] 来打印数据存储区中的多个字段(例如 'FirstName' 和 'LastName' 时,会出现错误:

    print player['FirstName', 'LastName']
 exceptions.KeyError: ('FirstName', 'LastName')

谁能告诉我为什么这不起作用以及如何修改代码以从 Datastore.prime 返回多个数据字段?

谢谢

【问题讨论】:

    标签: python json scrapy


    【解决方案1】:

    当您评估player['FirstName', 'LastName'] 时,Python 会尝试将('FirstName', 'LastName') 转换为元组并将其用作索引。但是从json.loads 返回的字典没有元组作为索引。因此,您需要分别查找每个字段,然后将它们一起join

    # simulate loading playerdata
    players = [
        {'FirstName': 'Podge', 'LastName': 'Hasglow'},
        {'FirstName': 'Milo', 'LastName': 'Holloway'},
        {'FirstName': 'Staisy', 'LastName': 'Beccasdaughter'},
    ]
    # or in your case:
    ##players = json.loads(playerdata)
    # now print them all
    for player in players:
        player_fullname = ' '.join(player[colname] for colname in ['FirstName', 'LastName'])
        print(player_fullname)
    

    【讨论】:

    • 您好,感谢您的回复。您在哪里使用了模拟负载的方法,我应该为我的实际负载使用什么语法?我现在有相同的正则表达式吗?
    • 用同样的正则表达式试试players = json.loads(playerdata)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2015-05-07
    • 2019-08-19
    • 2018-09-11
    相关资源
    最近更新 更多