Last active
May 16, 2023 21:14
-
-
Save Naedri/a304641b58613c952034dc22fc9dd7ac to your computer and use it in GitHub Desktop.
To parse places from a google maps list into a .geojson file powered by OSM, with ordered and linked points.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# This script executes the four Python files sequentially to perform a series of tasks. | |
# Make sure you have Python installed and the necessary dependencies for each Python script. | |
# pip install -r requirements.txt | |
# Step 1: Convert maps to JSON | |
python 01_maps_to_json.py --address_suffix ", Krakow" | |
# Step 2: Convert JSON to GeoJSON | |
python 02_json_to_geojson.py | |
# Step 3: Order points | |
python 03_order_points.py | |
# Step 4: Add lines between points | |
python 04_add_lines.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import json | |
from bs4 import BeautifulSoup | |
def extract_data_from_html(html_file, parent_class, name_tag, address_class): | |
""" | |
Extracts data from an HTML file based on the specified tags and classes. | |
Args: | |
html_file (str): The path to the HTML file. | |
parent_class (str): The class name for the parent nodes. | |
name_tag (str): The tag name for the name element. | |
address_class (str): The class name for the address element. | |
Returns: | |
list: A list of dictionaries, each representing an extracted object with 'name' and 'address' attributes. | |
""" | |
with open(html_file, 'r') as f: | |
soup = BeautifulSoup(f, 'html.parser') | |
data = [] | |
parent_nodes = soup.find_all('div', class_=parent_class) | |
for parent_node in parent_nodes: | |
name_element = parent_node.find(name_tag) | |
name = name_element.text.strip() if name_element else '' | |
address_element = parent_node.find('span', class_=address_class) | |
address = address_element.text.strip() if address_element else '' | |
entry = {'name': name, 'address': address} | |
data.append(entry) | |
return data | |
def find_address_node(parent_node, address_class): | |
""" | |
Finds the address node within the common ancestor of the parent node and the address elements. | |
Args: | |
parent_node (bs4.element.Tag): The parent node representing the name element. | |
address_class (str): The class name of the address element. | |
Returns: | |
bs4.element.Tag: The address node, or None if not found. | |
""" | |
# Find the common ancestor of the name and address elements | |
common_ancestor = parent_node.find_parent() | |
# Find the address node within the common ancestor | |
address_node = common_ancestor.find('span', class_=address_class) | |
return address_node | |
def append_string_to_attribute(json_array, attribute, string_to_append): | |
""" | |
Appends a string to a given attribute in a JSON array of objects. | |
Args: | |
json_array (list): JSON array of objects. | |
attribute (str): Attribute name to append the string to. | |
string_to_append (str): String to append to the attribute. | |
Returns: | |
list: Updated JSON array with the string appended to the attribute. | |
""" | |
for obj in json_array: | |
if attribute in obj: | |
obj[attribute] += string_to_append | |
return json_array | |
def main(): | |
parser = argparse.ArgumentParser( | |
description='Extract data from HTML file to JSON.', | |
usage='python 01_maps_to_json.py --html_file sample.html --parent_class myName --name_tag h2 --address_class myAddress --address_suffix ", my city"') | |
parser.add_argument('--html_file', type=str, default='maps.html', | |
help='Path to the HTML file (default: maps.html)') | |
parser.add_argument('--parent_class', type=str, default='WHf7fb', | |
help='Class name for the parent nodes (default: WHf7fb)'), | |
parser.add_argument('--name_tag', type=str, default='h3', | |
help='Tag for the name element (default: h3)') | |
parser.add_argument('--address_class', type=str, default='fKEVAc', | |
help='Class for the address element (default: fKEVAc)') | |
parser.add_argument('--address_suffix', type=str, default="None", | |
help='To be added at the end of the address, (default: None)') | |
args = parser.parse_args() | |
html_file = args.html_file | |
address_suffix = args.address_suffix | |
extracted_data = extract_data_from_html( | |
args.html_file, args.parent_class, args.name_tag, args.address_class) | |
# Add potential address_suffix | |
if address_suffix is not None: | |
extracted_data = append_string_to_attribute( | |
extracted_data, 'address', address_suffix) | |
# Save JSON data to a file | |
# Append .json extension to the base name | |
output_file = html_file.replace(".html", ".json") | |
with open(output_file, 'w') as f: | |
json.dump(extracted_data, f, indent=4) | |
print(f"Data successfully saved to '{output_file}'.") | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import json | |
import requests | |
def geocode_address(address): | |
""" | |
Geocodes an address using the OpenStreetMap API and returns the coordinates. | |
Args: | |
address (str): The address to geocode. | |
Returns: | |
tuple: A tuple containing the latitude and longitude coordinates. | |
""" | |
url = f'https://nominatim.openstreetmap.org/search?q={address}&format=json' | |
response = requests.get(url) | |
data = response.json() | |
if data: | |
latitude = float(data[0]['lat']) | |
longitude = float(data[0]['lon']) | |
return latitude, longitude | |
else: | |
return None, None | |
def generate_geojson(json_file): | |
""" | |
Reads the content of a JSON file, queries the OpenStreetMap API to obtain coordinates, | |
and generates a GeoJSON file with the coordinates. | |
Args: | |
json_file (str): The path to the input JSON file. | |
""" | |
with open(json_file, 'r') as f: | |
data = json.load(f) | |
features = [] | |
for item in data: | |
name = item['name'] | |
address = item['address'] | |
latitude, longitude = geocode_address(address) | |
if latitude is not None and longitude is not None: | |
feature = { | |
'type': 'Feature', | |
'properties': { | |
'name': name, | |
'address': address | |
}, | |
'geometry': { | |
'type': 'Point', | |
'coordinates': [longitude, latitude] | |
} | |
} | |
features.append(feature) | |
return { | |
'type': 'FeatureCollection', | |
'features': features | |
} | |
def main(): | |
parser = argparse.ArgumentParser( | |
description='Generate GeoJSON file from a JSON file containing name and address data') | |
parser.add_argument('--json_file', type=str, default='maps.json', | |
help='Path to the input JSON file') | |
args = parser.parse_args() | |
json_file = args.json_file | |
geojson = generate_geojson(json_file) | |
# Save JSON data to a file | |
# Append .json extension to the base name | |
output_file = json_file.replace(".json", ".geojson") | |
with open(output_file, 'w') as f: | |
json.dump(geojson, f, indent=4) | |
print(f"Data successfully saved to '{output_file}'.") | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import json | |
import geopy.distance | |
import networkx as nx | |
def load_geojson(file): | |
""" | |
Load a GeoJSON file and return the data. | |
Args: | |
file (str): Path to the GeoJSON file. | |
Returns: | |
dict: The loaded GeoJSON data. | |
""" | |
with open(file) as f: | |
data = json.load(f) | |
return data | |
def calculate_distances(points): | |
""" | |
Calculate distances between all pairs of points. | |
Args: | |
points (list): List of points with coordinates and properties. | |
Returns: | |
dict: Dictionary containing distances between each pair of points. | |
""" | |
distances = {} | |
for i in range(len(points)): | |
for j in range(i + 1, len(points)): | |
distances[(i, j)] = geopy.distance.distance( | |
points[i][0], points[j][0]).km | |
return distances | |
def create_graph(points, distances): | |
""" | |
Create a graph from the points and distances. | |
Args: | |
points (list): List of points with coordinates and properties. | |
distances (dict): Dictionary containing distances between each pair of points. | |
Returns: | |
networkx.Graph: The created graph. | |
""" | |
G = nx.Graph() | |
G.add_nodes_from(range(len(points))) | |
G.add_weighted_edges_from([(i, j, distances[(i, j)]) for i in range( | |
len(points)) for j in range(i + 1, len(points))]) | |
return G | |
def find_shortest_path(graph, source): | |
""" | |
Find the shortest path in the graph starting from the given source node. | |
Args: | |
graph (networkx.Graph): The graph. | |
source (int): The source node. | |
Returns: | |
list: The shortest path. | |
""" | |
path = nx.shortest_path(graph, source=source, weight='weight') | |
return path | |
def order_points(points, path): | |
""" | |
Order the points based on the shortest path and add "order" field to properties. | |
Args: | |
points (list): List of points with coordinates and properties. | |
path (list): The shortest path. | |
Returns: | |
list: The ordered points with updated properties. | |
""" | |
ordered_points = [ | |
(points[i][0], {**points[i][1], "order": idx + 1}) for idx, i in enumerate(path)] | |
return ordered_points | |
def main(): | |
parser = argparse.ArgumentParser( | |
description='Order points in a GeoJSON file based on shortest path') | |
parser.add_argument('--input_file', type=str, default='maps.geojson', | |
help='Path to the input GeoJSON file') | |
args = parser.parse_args() | |
input_file = args.input_file | |
# Load GeoJSON file | |
data = load_geojson(input_file) | |
# Extract list of points and their existing properties | |
points = [(tuple(feature['geometry']['coordinates']), feature['properties']) | |
for feature in data['features']] | |
# Set starting point (can be any point in the list) | |
start = points[0][0] | |
# Calculate distances between all pairs of points | |
distances = calculate_distances(points) | |
# Create graph | |
graph = create_graph(points, distances) | |
# Find shortest path | |
path = find_shortest_path(graph, source=0) | |
# Order points based on shortest path and add "order" field to properties | |
ordered_points = order_points(points, path) | |
# Create new GeoJSON file with ordered points and their existing properties | |
output_data = { | |
"type": "FeatureCollection", | |
"features": [] | |
} | |
for point in ordered_points: | |
feature = { | |
"type": "Feature", | |
"geometry": { | |
"type": "Point", | |
"coordinates": point[0] | |
}, | |
"properties": point[1] | |
} | |
output_data['features'].append(feature) | |
# Save JSON data to a file | |
# Append .json extension to the base name | |
output_file = input_file.replace(".geojson", "_ordered.geojson") | |
with open(output_file, 'w') as f: | |
json.dump(output_data, f) | |
print(f"Data successfully saved to '{output_file}'.") | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import argparse | |
import json | |
def add_lines_to_geojson(geojson_data): | |
""" | |
Add lines between ordered points in a GeoJSON file. | |
Args: | |
geojson_data (dict): GeoJSON data as a dictionary. | |
Returns: | |
dict: Modified GeoJSON data with lines added. | |
""" | |
features = geojson_data["features"] | |
line_string_coordinates = [] | |
# Add the coordinates of each point to a list to create lines between the points | |
for i in range(len(features) - 1): | |
current_coords = features[i]["geometry"]["coordinates"] | |
next_coords = features[i+1]["geometry"]["coordinates"] | |
line_string_coordinates.append(current_coords) | |
line_string_coordinates.append(next_coords) | |
# Create a LineString feature with the coordinates of the lines | |
line_string = { | |
"type": "Feature", | |
"geometry": { | |
"type": "LineString", | |
"coordinates": line_string_coordinates | |
} | |
} | |
# Add the LineString feature to the collection of features | |
features.append(line_string) | |
return geojson_data | |
def main(): | |
""" | |
Main function to add lines between ordered points in a GeoJSON file. | |
The function reads the input GeoJSON file containing ordered points and creates | |
a LineString feature connecting those points. The LineString feature is added | |
to the collection of features in the GeoJSON file. | |
Usage: python script.py input_file.geojson | |
Args: | |
input_file (str): Path to the input GeoJSON file. | |
""" | |
parser = argparse.ArgumentParser( | |
description='Add lines between ordered points in a GeoJSON file') | |
parser.add_argument('--input_file', type=str, default='maps_ordered.geojson', | |
help='Path to the input GeoJSON file') | |
args = parser.parse_args() | |
input_file = args.input_file | |
# Load the input GeoJSON file | |
with open(input_file, "r") as f: | |
geojson_data = json.load(f) | |
# Add lines to the GeoJSON data | |
modified_geojson_data = add_lines_to_geojson(geojson_data) | |
# Save the modified GeoJSON file | |
output_file = input_file.replace(".geojson", "_with_lines.geojson") | |
with open(output_file, "w") as f: | |
json.dump(modified_geojson_data, f) | |
print(f"Data successfully saved to '{output_file}'.") | |
if __name__ == '__main__': | |
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Lody Rinnela" | |
data-result-index="0" | |
data-section-id="12__fid:0x47165b26ad1cbec3:0x5b71b65d2745ac19" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJQXlnQSIsbnVsbCwwXQ==" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Lody Rinnela</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,7 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,7</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="21 avis" | |
>(21)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span></span>Glace <span aria-hidden="true">·</span> | |
<span class="fKEVAc">Floriańska 12</span> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipNGtOEApWodqPzBM7czf9LBuvXzkcyB-ncUOcab=w80-h142-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJVkNnQSJd" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Achats en magasin" | |
role="text" | |
style="font-weight: 400" | |
>Achats en magasin</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle13" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Camelot Cafe" | |
data-result-index="1" | |
data-section-id="12__fid:0x47165b11df44cb15:0x24c81acf0440cdeb" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJWUNnQSIsbnVsbCwxXQ==" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Camelot Cafe</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,5 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,5</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="3 157 avis" | |
>(3 157)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span aria-label="Prix: Abordable">$$</span> | |
<span aria-hidden="true">·</span> Café | |
<span aria-hidden="true">·</span> | |
<span class="fKEVAc">Świętego Tomasza 17</span> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 09:00 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipPsxg1kPtAFEWP67Ds18Ch2JCC_a9s__hQub_oS=w80-h106-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJd1FFb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Repas sur place" | |
role="text" | |
style="font-weight: 400" | |
>Repas sur place</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Aucune livraison" | |
role="text" | |
style="font-weight: 400" | |
>Aucune livraison</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle14" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Piwnica Pod Baranami" | |
data-result-index="2" | |
data-section-id="12__fid:0x47165b0ddc1d0f97:0x4e9ee563e7699ca8" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJekFFb0FBIixudWxsLDJd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Piwnica Pod Baranami</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,8 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,8</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li></ol></span | |
><span class="ciA11e" aria-label="3 354 avis" | |
>(3 354)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span aria-label="Prix: Abordable">$$</span> | |
<span aria-hidden="true">·</span> Bar à cocktails | |
<span aria-hidden="true">·</span> | |
<span class="fKEVAc">Pałac Pod Baranami, Rynek Główny 27</span> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(176, 96, 0, 1)" | |
>Ferme bientôt</span | |
><span style="font-weight: 400"> | |
⋅ 00:00 ⋅ Ouvre à 11:00 mar.</span | |
></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipOA5uFQ0sFXU8USFiqEUh_haDgFzzINdPSR79F_=w163-h92-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJcndJb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Repas sur place" | |
role="text" | |
style="font-weight: 400" | |
>Repas sur place</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Aucun plat à emporter" | |
role="text" | |
style="font-weight: 400" | |
>Aucun plat à emporter</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Aucune livraison" | |
role="text" | |
style="font-weight: 400" | |
>Aucune livraison</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle15" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Mines de sel de Wieliczka" | |
data-result-index="3" | |
data-section-id="12__fid:0x471643d805818e4b:0x972549aefd93b415" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJdWdJb0FBIixudWxsLDNd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Mines de sel de Wieliczka</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,6 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,6</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="21 294 avis" | |
>(21 294)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span></span>Lieu historique <span aria-hidden="true">·</span> | |
<span class="fKEVAc">Daniłowicza 10</span> | |
</div> | |
<div class="tSVUtf"> | |
<div class="KPxkLd"> | |
<span>Chapelles, chambres et lacs souterrains</span> | |
</div> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 08:30 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipPfwRktqZNvlM0LAuYPuEKeDJuBpG64D_DcNyKX=w122-h92-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJbWdNb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"><div class="Q4BGF"></div></div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle16" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Janina R B since 1902" | |
data-result-index="4" | |
data-section-id="12__fid:0x47165b125e591d9d:0xef12ee39c533959b" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJcGdNb0FBIixudWxsLDRd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Janina R B since 1902</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,4 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,4</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="63 avis" | |
>(63)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span></span>Boutique d'accessoires de mode | |
<span aria-hidden="true">·</span> | |
<span class="fKEVAc">Miodowa 4, Józefa Dietla 45</span> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 10:00 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipMCzghNKoUJx8k-E5tOvrGdeaZ6chPIB0v50D3i=w204-h92-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJaUFRb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Achats en magasin" | |
role="text" | |
style="font-weight: 400" | |
>Achats en magasin</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Drive disponible" | |
role="text" | |
style="font-weight: 400" | |
>Drive disponible</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span aria-label="Livraison" role="text" style="font-weight: 400" | |
>Livraison</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle17" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Bar Mleczny Flisak" | |
data-result-index="5" | |
data-section-id="12__fid:0x47165b739eb7b3b7:0x503bd030fc89f187" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJa3dRb0FBIixudWxsLDVd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Bar Mleczny Flisak</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,1 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,1</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd gMWVP"></li></ol></span | |
><span class="ciA11e" aria-label="911 avis" | |
>(911)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span aria-label="Prix: Bon marché">$</span> | |
<span aria-hidden="true">·</span> Bar | |
<span aria-hidden="true">·</span> | |
<span class="fKEVAc">Tadeusza Kościuszki 1</span> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 10:00 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipM3erafXjohLB0ZbnJ2c2wK9dN9riQAEzws37Q6=w80-h106-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJOUFRb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Repas sur place" | |
role="text" | |
style="font-weight: 400" | |
>Repas sur place</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Vente à emporter" | |
role="text" | |
style="font-weight: 400" | |
>Vente à emporter</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Aucune livraison" | |
role="text" | |
style="font-weight: 400" | |
>Aucune livraison</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle18" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Collegium Maius" | |
data-result-index="6" | |
data-section-id="12__fid:0x47165b0c32a892c7:0x74221849e13eb8f3" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJX3dRb0FBIixudWxsLDZd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Collegium Maius</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,7 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,7</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="646 avis" | |
>(646)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span></span>Musée <span aria-hidden="true">·</span> | |
<span class="fKEVAc">Jagiellońska 15</span> | |
</div> | |
<div class="tSVUtf"> | |
<div class="KPxkLd"> | |
<span>Université du XIVe siècle avec un musée</span> | |
</div> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 10:00 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipMg3c90u9lxnXMjl9NhMbWglXNoC0_F9soGJZNa=w122-h92-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJM3dVb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"><div class="Q4BGF"></div></div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle19" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Veganic Restaurant" | |
data-result-index="7" | |
data-section-id="12__fid:0x47165b09bc4bea63:0x8a1e36030bc28db5" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJNlFVb0FBIixudWxsLDdd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Veganic Restaurant</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,5 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,5</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="2 706 avis" | |
>(2 706)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span aria-label="Prix: Abordable">$$</span> | |
<span aria-hidden="true">·</span> Végétalienne | |
<span aria-hidden="true">·</span> | |
<span class="fKEVAc">Karmelicka 34</span> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 09:00 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipN_3w_aACf9k-KjFXzLU_Dh5GHdHnsWYxHo2C3P=w122-h92-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJelFZb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Repas sur place" | |
role="text" | |
style="font-weight: 400" | |
>Repas sur place</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Drive disponible" | |
role="text" | |
style="font-weight: 400" | |
>Drive disponible</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Livraison sans contact" | |
role="text" | |
style="font-weight: 400" | |
>Livraison sans contact</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle20" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Zamek Wawel" | |
data-result-index="8" | |
data-section-id="12__fid:0x47165b45e0da252b:0x3205e8355f8c7cfe" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJMmdZb0FBIixudWxsLDhd" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Zamek Wawel</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,6 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,6</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="108 avis" | |
>(108)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span></span>Site historique <span aria-hidden="true">·</span> | |
<span class="fKEVAc">Zamek Wawel</span> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipNtVq6qM1Z6WvLmdHm9DvNTgW2TUFgBLIWptSBG=w80-h106-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJcVFjb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"><div class="Q4BGF"></div></div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle21" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div class="m6QErb" style=""> | |
<div | |
role="link" | |
tabindex="0" | |
jsaction="pane.resultSection.click; clickmod:pane.resultSection.clickmod; keydown:pane.resultSection.keydown; mouseover:pane.resultSection.in; mouseout:pane.resultSection.out; focus:pane.resultSection.focusin; blur:pane.resultSection.focusout" | |
class="WHf7fb" | |
aria-label="Tbilisuri Restaurant" | |
data-result-index="9" | |
data-section-id="12__fid:0x47165b6a3189ac8d:0x664b4dcd74216189" | |
jslog="39539; track:click,contextmenu; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1E4QmNJdEFjb0FBIixudWxsLDld" | |
> | |
<div class="PXnPJd"></div> | |
<div class="IMSio"> | |
<div class="l1KL8d"> | |
<div class="fhISve"> | |
<div class="sjJZ6b"> | |
<div class="P2De3b"> | |
<h3 class="kiaEld"><span>Tbilisuri Restaurant</span></h3> | |
<div class="section-subtitle-extension"></div> | |
<span | |
><span | |
><span aria-label="4,6 étoiles" | |
><span class="U8T7xe" aria-hidden="true">4,6</span> | |
<ol class="U6stEc"> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd"></li> | |
<li class="HFPZDd LvtBRd"></li></ol></span | |
><span class="ciA11e" aria-label="2 316 avis" | |
>(2 316)</span | |
></span | |
></span | |
> | |
</div> | |
</div> | |
<div></div> | |
</div> | |
<div class="zTNHUc"> | |
<span aria-label="Prix: Abordable">$$</span> | |
<span aria-hidden="true">·</span> Géorgienne | |
<span aria-hidden="true">·</span> | |
<span class="fKEVAc">Beera Meiselsa 5</span> | |
</div> | |
<div class="tSVUtf"> | |
<div class="KPxkLd"> | |
<span>Restaurant simple, cuisine géorgienne classique</span> | |
</div> | |
</div> | |
<div class="wpNPMc"> | |
<span class="zXFjbb"> | |
<span | |
><span style="font-weight: 400; color: rgba(217, 48, 37, 1)" | |
>Fermé</span | |
><span style="font-weight: 400"> ⋅ Ouvre à 13:00 mar.</span></span | |
></span | |
> | |
</div> | |
<div class="hLLQde"></div> | |
</div> | |
<div class="R4GW7c"> | |
<div | |
class="AyApzc" | |
style=" | |
background-image: url('https://lh5.googleusercontent.com/p/AF1QipNw7gWG_l-UwNlcIZnIGH69hB8yZuOk7WX-hT1Y=w122-h92-k-no'); | |
" | |
jslog="25178; mutable:true;metadata:WyIwYWhVS0V3aUIzdmVIcWZqLUFoWFB3b3NLSFdDOEF5Y1F6Q2NJbFFnb0FBIl0=" | |
></div> | |
</div> | |
</div> | |
<div class="RnWEQ"></div> | |
<div class="xwpDKc n8sPKe"> | |
<div class="Ahnjwc"> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Repas sur place" | |
role="text" | |
style="font-weight: 400" | |
>Repas sur place</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span | |
aria-label="Vente à emporter" | |
role="text" | |
style="font-weight: 400" | |
>Vente à emporter</span | |
> | |
</div> | |
<span class="M4A5Cf" aria-hidden="true">·</span> | |
</div> | |
<div class="W6VQef"> | |
<div class="ah5Ghc"> | |
<span aria-label="Livraison" role="text" style="font-weight: 400" | |
>Livraison</span | |
> | |
</div> | |
</div> | |
<div class="Q4BGF"></div> | |
</div> | |
</div> | |
<div class="A4whae"></div> | |
<div class="Oupsib"></div> | |
</div> | |
<div class="m6QErb" style="padding-left: 24px"> | |
<div class=""> | |
<button | |
class="M77dve" | |
aria-label="Ajouter un commentaire" | |
jslog="102833;track:click;mutable:true;" | |
jsaction="pane.wfvdle22" | |
> | |
<div class="BgrMEd mRai6b cYlvTc VOgY4"> | |
<div class="OyjIsf zemfqc"></div> | |
<span class="wNNZR fontTitleSmall">Ajouter un commentaire</span> | |
</div> | |
</button> | |
</div> | |
</div> | |
</div> | |
<div role="presentation" class="qCHGyb ipilje" style="height: 0px"></div> | |
<div></div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
"name": "Lody Rinnela", | |
"address": "Floria\u0144ska 12, Krakow" | |
}, | |
{ | |
"name": "Camelot Cafe", | |
"address": "\u015awi\u0119tego Tomasza 17, Krakow" | |
}, | |
{ | |
"name": "Piwnica Pod Baranami", | |
"address": "Pa\u0142ac Pod Baranami, Rynek G\u0142\u00f3wny 27, Krakow" | |
}, | |
{ | |
"name": "Mines de sel de Wieliczka", | |
"address": "Dani\u0142owicza 10, Krakow" | |
}, | |
{ | |
"name": "Janina R B since 1902", | |
"address": "Miodowa 4, J\u00f3zefa Dietla 45, Krakow" | |
}, | |
{ | |
"name": "Bar Mleczny Flisak", | |
"address": "Tadeusza Ko\u015bciuszki 1, Krakow" | |
}, | |
{ | |
"name": "Collegium Maius", | |
"address": "Jagiello\u0144ska 15, Krakow" | |
}, | |
{ | |
"name": "Veganic Restaurant", | |
"address": "Karmelicka 34, Krakow" | |
}, | |
{ | |
"name": "Zamek Wawel", | |
"address": "Zamek Wawel, Krakow" | |
}, | |
{ | |
"name": "Tbilisuri Restaurant", | |
"address": "Beera Meiselsa 5, Krakow" | |
} | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.9396638, 50.0627956]}, "properties": {"name": "Lody Rinnela", "address": "Floria\u0144ska 12, Krakow", "order": 1}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.9390841, 50.0629978]}, "properties": {"name": "Camelot Cafe", "address": "\u015awi\u0119tego Tomasza 17, Krakow", "order": 2}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.935021954490907, 50.061629249999996]}, "properties": {"name": "Piwnica Pod Baranami", "address": "Pa\u0142ac Pod Baranami, Rynek G\u0142\u00f3wny 27, Krakow", "order": 3}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.6282856, 50.1330028]}, "properties": {"name": "Bar Mleczny Flisak", "address": "Tadeusza Ko\u015bciuszki 1, Krakow", "order": 4}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [20.11377, 50.13607]}, "properties": {"name": "Collegium Maius", "address": "Jagiello\u0144ska 15, Krakow", "order": 5}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.9297069, 50.0660987]}, "properties": {"name": "Veganic Restaurant", "address": "Karmelicka 34, Krakow", "order": 6}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.93515129952599, 50.05394215]}, "properties": {"name": "Zamek Wawel", "address": "Zamek Wawel, Krakow", "order": 7}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [19.9428017, 50.0508004]}, "properties": {"name": "Tbilisuri Restaurant", "address": "Beera Meiselsa 5, Krakow", "order": 8}}]} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
argparse==1.4.0 | |
beautifulsoup4==4.11.2 | |
geopy==2.3.0 | |
networkx==3.1o | |
requests==2.30.0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment