how to access object properties in json using beautifulsoup? python
Question:
from bs4 import BeautifulSoup
import fake_useragent
import requests
ua = fake_useragent.UserAgent()
import soupsieve as sv
url = "https://search-maps.yandex.ru/v1/?text=%D0%9F%D0%BE%D1%87%D1%82%D0%B0%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8,%20%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80&results=500&type=biz&lang=ru_RU&apikey=d9168899-cf24-452a-95cf-06d7ac5a982b"
r = requests.get(url, headers={"User-Agent": ua.random})
soup = BeautifulSoup(r.text, 'lxml')
print(soup.find("p"))
i want to choose from this list only two properties like "boundedBy" and "coordinates"
How can i do it?I ve checked the whole bs documentation, but didnt find a solution
Answers:
The result from the server is in Json format, so use json parser or .json()
method to decode it:
import json
import requests
url = "https://search-maps.yandex.ru/v1/?text=%D0%9F%D0%BE%D1%87%D1%82%D0%B0%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8,%20%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80&results=500&type=biz&lang=ru_RU&apikey=d9168899-cf24-452a-95cf-06d7ac5a982b"
data = requests.get(url).json()
# uncomment this to print all data:
# print(json.dumps(data, indent=4))
print(data["properties"]["ResponseMetaData"]["SearchRequest"]["boundedBy"])
Prints:
[[37.048427, 55.43644866], [38.175903, 56.04690174]]
Use the .json()
method of the response, since the data is JSON. You can then iterate over the features in the response. Note you can set the parameters separate from the URL so they are readable and easier to change:
import requests
import json
url = 'https://search-maps.yandex.ru/v1'
params = {'text': 'Почта России, Краснодар',
'results': 500,
'type': 'biz',
'lang': 'ru_RU',
'apikey': 'd9168899-cf24-452a-95cf-06d7ac5a982b'}
r = requests.get(url, params=params)
if r.ok:
data = r.json()
for feature in data['features']:
x,y = feature["geometry"]["coordinates"]
(x1,y1),(x2,y2) = feature["properties"]["boundedBy"]
print(f'coordinates ({x:.6f}, {y:.6f}): bounds ({x1:.6f}, {y1:.6f})-({x2:.6f}, {y2:.6f})')
Output:
coordinates (38.969711, 45.028356): bounds (38.965656, 45.025508)-(38.973867, 45.031330)
coordinates (38.969660, 45.028365): bounds (38.965656, 45.025508)-(38.973867, 45.031330)
coordinates (38.993199, 45.063675): bounds (38.989012, 45.060879)-(38.997223, 45.066698)
coordinates (39.029821, 45.048676): bounds (39.025753, 45.045304)-(39.033964, 45.051124)
coordinates (38.992736, 45.034352): bounds (38.988590, 45.031496)-(38.996801, 45.037318)
...
from bs4 import BeautifulSoup
import fake_useragent
import requests
ua = fake_useragent.UserAgent()
import soupsieve as sv
url = "https://search-maps.yandex.ru/v1/?text=%D0%9F%D0%BE%D1%87%D1%82%D0%B0%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8,%20%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80&results=500&type=biz&lang=ru_RU&apikey=d9168899-cf24-452a-95cf-06d7ac5a982b"
r = requests.get(url, headers={"User-Agent": ua.random})
soup = BeautifulSoup(r.text, 'lxml')
print(soup.find("p"))
i want to choose from this list only two properties like "boundedBy" and "coordinates"
How can i do it?I ve checked the whole bs documentation, but didnt find a solution
The result from the server is in Json format, so use json parser or .json()
method to decode it:
import json
import requests
url = "https://search-maps.yandex.ru/v1/?text=%D0%9F%D0%BE%D1%87%D1%82%D0%B0%20%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8,%20%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80&results=500&type=biz&lang=ru_RU&apikey=d9168899-cf24-452a-95cf-06d7ac5a982b"
data = requests.get(url).json()
# uncomment this to print all data:
# print(json.dumps(data, indent=4))
print(data["properties"]["ResponseMetaData"]["SearchRequest"]["boundedBy"])
Prints:
[[37.048427, 55.43644866], [38.175903, 56.04690174]]
Use the .json()
method of the response, since the data is JSON. You can then iterate over the features in the response. Note you can set the parameters separate from the URL so they are readable and easier to change:
import requests
import json
url = 'https://search-maps.yandex.ru/v1'
params = {'text': 'Почта России, Краснодар',
'results': 500,
'type': 'biz',
'lang': 'ru_RU',
'apikey': 'd9168899-cf24-452a-95cf-06d7ac5a982b'}
r = requests.get(url, params=params)
if r.ok:
data = r.json()
for feature in data['features']:
x,y = feature["geometry"]["coordinates"]
(x1,y1),(x2,y2) = feature["properties"]["boundedBy"]
print(f'coordinates ({x:.6f}, {y:.6f}): bounds ({x1:.6f}, {y1:.6f})-({x2:.6f}, {y2:.6f})')
Output:
coordinates (38.969711, 45.028356): bounds (38.965656, 45.025508)-(38.973867, 45.031330)
coordinates (38.969660, 45.028365): bounds (38.965656, 45.025508)-(38.973867, 45.031330)
coordinates (38.993199, 45.063675): bounds (38.989012, 45.060879)-(38.997223, 45.066698)
coordinates (39.029821, 45.048676): bounds (39.025753, 45.045304)-(39.033964, 45.051124)
coordinates (38.992736, 45.034352): bounds (38.988590, 45.031496)-(38.996801, 45.037318)
...