Web Scraping:在 Python 中解析 JSON 时出现 KeyError

Posted

技术标签:

【中文标题】Web Scraping:在 Python 中解析 JSON 时出现 KeyError【英文标题】:Web Scraping: getting KeyError when parsing JSON in Python 【发布时间】:2018-02-25 19:38:21 【问题描述】:

我想从网页中提取完整地址,我正在使用 BeautifulSoup 和 JSON。 这是我的代码:

import bs4
import json
from bs4 import BeautifulSoup
import requests

url = 'xxxxxxxxxxxxxxxxx'
response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'html.parser')

for i in soup.find_all('div', attrs='data-integration-name':'redux-container'):
    info = json.loads(i.get('data-payload'))

我打印了“信息”:

'storeName': None, 'props': 'locations': ['dirty': False, 'updated_at': '2016-05-05T07:57:19.282Z', 'country_code': 'US', 'company_id': 106906, 'longitude': -74.0001954, 'address': '5 Crosby St  3rd Floor', 'state': 'New York', 'full_address': '5 Crosby St  3rd Floor, New York, 10013, New York, USA', 'country': 'United States', 'id': 17305, 'to_params': 'new-york-us', 'latitude': 40.719753, 'region': '', 'city': 'New York', 'description': '', 'created_at': '2015-01-19T01:32:16.317Z', 'zip_code': '10013', 'hq': True], 'name': 'LocationsMapList'

我想要的是“位置”下的“完整地址”,所以我的代码是:

info = json.loads(i.get('data-payload'))
for i in info['props']['locations']:
        print (i['full_address'])

但是我收到了这个错误:

----> 5     for i in info['props']['locations']:

KeyError: 'locations'

我想打印完整的地址,即“5 Crosby St 3rd Floor, New York, 10013, New York, USA”。

非常感谢!

【问题讨论】:

在迭代你的第二个信息时没有locations 'props' 值中的键 【参考方案1】:

您正在解析的数据似乎不一致,键不在所有对象中。

如果您仍想执行循环,则需要使用 try/except 语句来捕获异常,或使用方法 get 在查找字典中可能存在的键时设置回退不在这里。

info = json.loads(i.get('data-payload'))
for item in info['props'].get('locations', []):
    print (item.get('full_address', 'no address'))

get('locations', []) :如果键 location 不存在,则返回一个空列表,因此循环不会运行任何迭代。

get('full_address', 'no address') :如果没有这样的密钥,则返回“无地址”


编辑:

数据不一致(从不信任数据)。一些 JSON 对象有一个键 props 和一个 null /None 值。下一个修复应该更正:

info = json.loads(i.get('data-payload'))
if info.get('props'):
    for item in info['props'].get('locations', []):
        print (item.get('full_address', 'no address'))

【讨论】:

It got another error" ----> 5 for item in info['props'].get('locations', []): AttributeError: 'NoneType' object has no attribute 'get '【参考方案2】:

您的第一个对象很好,但很明显您的第二个对象在任何地方都没有locations 键,也没有full_address

【讨论】:

'props': 'locations': ['dirty': False, 'updated_at': '2016-05-05T07:57:19.282Z', 'country_code': 'US', 'company_id': 106906, 'longitude': -74.0001954, 'address': '5 Crosby St 3rd Floor', 'state': 'New York', 'full_address': '5 Crosby St 3rd Floor, New York, 10013,纽约,美国','国家':'美国','id':17305,'to_params':'new-york-us','纬度':40.719753,'区域':'','城市': 'New York', 'description': '', 'created_at': '2015-01-19T01:32:16.317Z', 'zip_code': '10013', 'hq': True], 'name': 'LocationsMapList' @Laura 这不是您发布的第二个示例对象。您可以在此页面上对locations 简单地按 Ctrl+F 来查看它在第一个对象中,而不是第二个对象中。 是的,我只粘贴了输出中的几行。我想要的唯一部分是第一个对象中位置下的完整地址的内容。

以上是关于Web Scraping:在 Python 中解析 JSON 时出现 KeyError的主要内容,如果未能解决你的问题,请参考以下文章

阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

无法在 CSV 中存储信息(Python Web Scraping)

使用 Python 和 asyncio 进行 Web Scraping

Python中的Web Scraping

Rap Genius w/ Python 上的 Web Scraping Rap 歌词

Python的基本Web Scraping(Beautifulsoup和Requests)