Этот сайт извлекает данные из этого API https://maps.pandora.net/api/getAsyncLocations
со значением search
в параметрах запроса. Результатом является объект JSON с полем maplist
, которое содержит данные html (один div). Этот div включает несколько JSON-объектов, разделенных запятой:
curl 'https://maps.pandora.net/api/getAsyncLocations?level=domain&template=domain&search=Melbourne+Victoria%2C+Australie'
Таким образом, нам нужно переставить запятую JSON-объектов в массив для его анализа. В следующем примере для извлечения данных используются curl , jq (анализатор json), sed & pup (анализатор html):
search="Melbourne+Victoria+Australie"
curl -s -G 'https://maps.pandora.net/api/getAsyncLocations' \
-d 'level=domain' \
-d 'template=domain' \
-d "search=$search" | \
jq -r '.maplist' | \
pup -p div text{} | \
sed '$ s/.$//' | \
sed -e "\$a]" | \
sed '1s/^/[/' | \
jq '.[] | {
location: .location_name,
address: .address_1,
complement: (.city + "," + .big_region + " " + .location_post_code)
}'
В Python с Python-запросами & beautifulsoup :
import requests
from bs4 import BeautifulSoup
import json
search = "Melbourne+Victoria+Australie"
response = requests.get(
'https://maps.pandora.net/api/getAsyncLocations',
params = {
'level':'domain',
'template':'domain',
'search': search
}
)
soup = BeautifulSoup(response.json()['maplist'], 'html.parser')
formatted_json = "[{}]".format(soup.div.string[:-1])
data = json.loads(formatted_json)
print([
(i['location_name'], i['address_1'], i['city'], i['big_region'], i['location_post_code'])
for i in data
])