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