Разбирайте маркеры Google Maps от JS с помощью BeautifulSoup

pickenpack спросил: 28 марта 2018 в 02:11 в: python

Как я могу очистить lat и lng от такого js-блока с помощью Python + Beautiful Soup?

Gmaps.map.markers = [{"id": 6,"multi_system": "Нет", "connectedProjects": null, "description": "Kaheawa Wind Project - Younicos
Страна: США Тип технологии: Электрохимический
Статус: Операционный", "Изображение": "http ://chart.apis.google.com/chart chst = d_map_pin_letter & амп; CHLD =% E2% 80% А2 | FE7569" ,"ширина?": 32,"высота": 32,"ш": 20,7983626,"LNG" : -156.3319253}];

Базовый код (см. мой последний вопрос ):

import requests
from bs4 import BeautifulSouppage = requests.get("https://www.energystorageexchange.org/projects/6") 
soup = BeautifulSoup(page.content, 'lxml')coord = soup.findAll("Gmaps.map.markers")

Спасибо за любой ответ.

2 ответа

drec4s ответил: 28 марта 2018 в 06:30

Вы можете использовать этот подход. Получите данные dict из этой переменной и проанализируйте их с помощью модуля json:

import jsonJS_BLOCK = """Gmaps.map.markers = [{"id":6,"multi_system":"No","connectedProjects":null,"description":"Kaheawa Wind Project - Younicos
Country : United States
Technology Type : Electro-chemical
Status : Operational","picture":"http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|FE7569","width":32,"height":32,"lat":20.7983626,"lng":-156.3319253}];"""ini = JS_BLOCK.find("Gmaps.map.markers = [") + len("Gmaps.map.markers = [")
end = JS_BLOCK.find("}];") + 1data = json.loads(JS_BLOCK[ini:end].replace('\n', ''))print(data['lat'])
print(data['lng'])

Output:

20.7983626
-156.3319253

Вы также можете попробовать подход regex, чтобы сделать это, если хотите.

pickenpack ответил: 29 марта 2018 в 12:53
Как я могу заменить JS_BLOCK моей веб-страницей? Ни суп, ни page / page.content не работают!
drec4s ответил: 29 марта 2018 в 03:00
Это совершенно другой вопрос. Если вы не можете разобрать его с Beautifulsoup, попробуйте селен
Jatimir ответил: 29 марта 2018 в 03:21
На самом деле, вы ответили на совершенно другой вопрос: D OP даже включил код, когда он пытается вычеркнуть его из Интернета ^^
Jatimir ответил: 29 марта 2018 в 03:37

Решение Regex:

Код:

import json
import re
import requestsurl = 'https://www.energystorageexchange.org/projects/6'r = requests.get(url)
html = r.textmarkers_raw = re.search(
    r'Gmaps\.map\.markers'
    r'\s*=\s*'
    r'(.*);', html).group(1)markers = json.loads(markers_raw)import pprint
pprint.pprint(markers)

Вывод:

[{'connectedProjects': None,
  'description': "<a href='/projects/6'>Kaheawa Wind Project - "
                 'Younicos</a><br>Country : United States<br>Technology Type : '
                 'Electro-chemical<br>Status : Operational',
  'height': 32,
  'id': 6,
  'lat': 20.7983626,
  'lng': -156.3319253,
  'multi_system': 'No',
  'picture': 'http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|FE7569',
  'width': 32}]

Если регулярные выражения являются новыми для вас, вы можете посмотреть здесь.