【问题标题】:Parsing json element解析json元素
【发布时间】:2014-10-31 11:04:42
【问题描述】:

我正在使用 Scrapy 和 Regex 来解析一些非标准的 Web 源代码。然后我希望解析返回的字典的第一个元素:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item
from scrapy.spider import BaseSpider
from scrapy import log
from scrapy.cmdline import execute
from scrapy.utils.markup import remove_tags
import time
import re
import json
import requests


class ExampleSpider(CrawlSpider):
    name = "goal2"
    allowed_domains = ["whoscored.com"]
    start_urls = ["http://www.whoscored.com"]
    download_delay = 5

    rules = [Rule(SgmlLinkExtractor(allow=('\Teams'),deny=(),), follow=False, callback='parse_item')]

    def parse_item(self, response):

        sel = Selector(response)
        titles = sel.xpath("normalize-space(//title)")
        print '-' * 170
        myheader = titles.extract()[0]
        print '********** Page Title:', myheader.encode('utf-8'), '**********'
        print '-' * 170

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


        if match1 is not None:
            playerdata1 = match1.group(1)

            teamid = json.loads(playerdata1[0])
            print teamid

“playerdata1”的第一个元素的键称为“TeamId”。我认为上述方法可行,但出现以下错误:

    teamid = json.loads(playerdata1[0])
  File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
exceptions.ValueError: Expecting object: line 1 column 1 (char 0)

谁能看到这里有什么问题?

【问题讨论】:

  • 您是否希望 match1.group(1) 成为 JSON 字符串?试试teamid = json.loads(playerdata1)[0]
  • 如果您至少可以给我们一个示例 URL 进行测试,这将有所帮助,其中包含 DataStore.prime 文本。
  • @MartijnPieters 是的,没问题...这里有一个链接...view-source:whoscored.com/Teams/32/… 在这个例子中我希望变量 'teamid' 的值等于 '32'此页面上团队的 ID。谢谢

标签: python regex json scrapy


【解决方案1】:

match1.group(1) 返回一个字符串。然后索引该字符串:

teamid = json.loads(playerdata1[0])

在此,[0] 将为您提供只是该字符串的第一个字符。删除那里的索引表达式以使用 whole 字符串:

teamid = json.loads(playerdata1)

现在teamid 是一个包含玩家对象的列表:

>>> len(teamid)
22
>>> teamid[0].keys()
[u'FirstName', u'LastName', u'KnownName', u'Field', u'GameStarted', u'AerialWon', u'TeamRegionCode', u'SecondYellow', u'ShotsBlocked', u'TotalShots', u'Assists', u'Red', u'Name', u'PositionText', u'Ranking', u'PositionLong', u'PlayerId', u'SubOff', u'Dispossesed', u'TeamId', u'TotalTackles', u'TotalLongBalls', u'Goals', u'SubOn', u'WasDribbled', u'AerialLost', u'Turnovers', u'ShotsOnTarget', u'WSName', u'Fouls', u'ManOfTheMatch', u'Height', u'TeamName', u'RegionCode', u'TotalPasses', u'TotalThroughBalls', u'Dribbles', u'DateOfBirth', u'OwnGoals', u'WasFouled', u'TotalClearances', u'Rating', u'PlayedPositionsRaw', u'Weight', u'AccurateLongBalls', u'OffsidesWon', u'AccuratePasses', u'Yellow', u'KeyPasses', u'TotalCrosses', u'AccurateCrosses', u'IsCurrentPlayer', u'Age', u'PositionShort', u'AccurateThroughBalls', u'Interceptions', u'Offsides']

【讨论】:

  • 嗨,我不确定“删除那里的索引表达式以使用整个字符串”是什么意思。谢谢...
  • @user3045351:鉴于您的 URL 上述工作正常,它会为您提供一个包含字典的列表,每个列表都是一个播放器。
  • 我仍然对如何使用上面示例中的代码将“TeamId”解析为“32”感到困惑。谢谢...
  • @user3045351: teamid[0]['TeamId'].
【解决方案2】:

当我需要查询复杂 JSON 中的小部分时,我经常使用 ObjectPath。

它具有类似于 CSS 选择器的查询语言。检查示例 http://adriank.github.io/ObjectPath/

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多