我想从网页中提取完整地址,我正在使用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'。
非常感谢!
答案 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
。