Web Scraping:在Python中解析JSON时获取KeyError

时间:2017-09-16 23:45:10

标签: python json beautifulsoup keyerror

我想从网页中提取完整地址,我正在使用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'))

我打印出'info':

{'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'}

我想要的是“位置”下的“full_address”,所以我的代码是:

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'。

非常感谢!

2 个答案:

答案 0 :(得分:2)

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

如果您仍想执行循环,则需要使用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'))

答案 1 :(得分:1)

您的第一个对象很好,但很清楚您的第二个对象在任何地方都没有locations个密钥,也没有full_address