【问题标题】:python create JSON string throws an exceptionpython创建JSON字符串抛出异常
【发布时间】:2016-04-07 13:34:51
【问题描述】:

这是我遇到的错误

ERROR:scrapy.core.scraper:Error processing {'action': u'Rent',
 'ad_images': [bla bla bla],
 'ad_link': u'does_not_exit_in_this_website',
 'ad_title': u'boa bra bra',
 'agent_fees': 2300.0,
 'amenities': u'boa bra bra',
 'area': u'does_not_exit_in_this_website',
 'bathrooms': 1.0,
 'bedrooms': u'1',
 'building': u'',
 'category': u'Apartment',
 'city': -1,
 'commission': u'does_not_exit_in_this_website',
 'coordinates': u'does_not_exit_in_this_website',
 'country': u'',
 'ded_licence_number': u'718652',
 'description': u'Description:',
 'furnished': u'No',
 'latitude': -1,
 'link': u'bla bla bla',
 'location': u'',
 'longitude': -1,
 'mobile': u'does_not_exit_in_this_website',
 'payment_type': u'does_not_exit_in_this_website',
 'phone': u'',
 'phoneticarea': u'does_not_exit_in_this_website',
 'phoneticbuilding': u'does_not_exit_in_this_website',
 'phoneticsubarea': u'does_not_exit_in_this_website',
 'posting_date': u'2016-01-04',
 'price': u'does_not_exit_in_this_website',
 'price_sqft': u'does_not_exit_in_this_website',
 'property_reference': u'Ramzi',
 'rent_is_paid': u'Quarterly',
 'rera_registration_number': u'15691',
 'security_deposit': u'does_not_exit_in_this_website',
 'size': 1000.0,
 'source': u'dubizzleproperty',
 'subarea': u'does_not_exit_in_this_website',
 'trade_name': u'BLUE HOME PROPERTIES',
 'type': u'does_not_exit_in_this_website',
 'yearly_cost': 43000.0}
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "bra bra bla/pipelines.py", line 70, in process_item
    body = '{"building": "{0}", "area" : "{1}", "subarea" : "{2}", "country" : "{3}", "city" : "{4}", "payment_type" : "{5}", "category" : "{6}", "phoneticbuilding" : "{7}", "phoneticarea" : "{8}", "phoneticssubarea": "{9}" }'.format(building, area, subarea, country, city, payment_type, category, phoneticbuilding, phoneticarea, phoneticssubarea)
KeyError: '"building"'

如果你想知道 pipelines 文件的第 70 行,请看这里:

body = '{"building": "{0}", "area" : "{1}", "subarea" : "{2}", "country" : "{3}", "city" : "{4}", "payment_type" : "{5}", "category" : "{6}", "phoneticbuilding" : "{7}", "phoneticarea" : "{8}", "phoneticssubarea": "{9}" }'.format(building, area, subarea, country, city, payment_type, category, phoneticbuilding, phoneticarea, phoneticssubarea)

【问题讨论】:

  • 你为什么要自己格式化 JSON 而不是使用库呢?一旦插入的元素也包含由 JSON 解释的任何内容,您自行改造的解决方案就会中断。
  • @UlrichEckhardt 好主意,请问您有什么建议?
  • 为 Python 使用 JSON 库?在网上搜索!
  • @UlrichEckhardt 我正在考虑。 body 变量只是字符串,即使它的值是 JSON 格式。所以这个异常不会使用 JSON 库来解决。你不觉得吗?
  • 阅读一些文档并尝试一下。

标签: python json python-2.7 scrapy


【解决方案1】:

正如@arthur 所说,您需要用两个括号替换单个大括号。我要补充一点,您应该在将成为 JSON 字符串的键值的文本中执行此操作:

例如(字符串的短版本),替换:

body = '{"building": "{0}", "area" : "{1}" }'.format(building, area)

与:

body = '{{"building": "{0}", "area" : "{1}" }}'.format(building, area)

【讨论】:

    【解决方案2】:

    尝试转义正文的非格式 {} 括号。

    编辑:这意味着用{{}} 替换它们。见How can I print literal curly-brace characters in python string and also use .format on it?

    【讨论】:

    • 这些对于创建 JSON 文件很重要,否则就不是 JSON 格式的字符串。你不觉得吗?
    • 转义(不删除,替换为{{}})将避免.format 将括号解释为替换指令。它们是保留字符。
    • 如果你知道这个 body = '\{"building": "{0}", "area" : "{1}", "subarea" : "{2}", "country" :“{3}”、“城市”:“{4}”、“payment_type”:“{5}”、“类别”:“{6}”、“语音构建”:“{7}”、“语音区域” : "{8}", "phoneticssubarea": "{9}" \}'.format(building, area, subarea, country, city, payment_type, category, phoneticbuilding, phoneticarea, phoneticssubarea)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多