如何用Python+BeautifulSoup从JS代码块提取Google Maps标记的经纬度
用Python + BeautifulSoup提取JS代码中的Gmaps标记经纬度
嘿,我来帮你搞定这个问题!要从包含Gmaps.map.markers的JS代码块里提取纬度(lat)和经度(lng),用Python结合BeautifulSoup完全可以做到——不过得搭配正则表达式一起用,因为BeautifulSoup擅长处理HTML结构,没法直接解析JavaScript的逻辑。下面是具体的步骤和代码示例:
步骤1:导入必要的库
首先得把需要的工具库导入进来,requests用来抓取页面,BeautifulSoup用来解析HTML找JS代码块,re用来做正则匹配提取经纬度:
import requests from bs4 import BeautifulSoup import re
步骤2:抓取页面并定位目标JS代码块
先请求目标页面,然后用BeautifulSoup遍历所有<script>标签,找到包含Gmaps.map.markers的那一段JS代码:
# 替换成你要抓取的目标页面URL target_url = "https://your-target-page.com" # 可以加个User-Agent模拟浏览器,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 发送请求并解析HTML response = requests.get(target_url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 遍历所有script标签,定位包含目标标记的JS代码 target_js_content = None for script_tag in soup.find_all("script"): # 检查script标签里的文本是否包含目标关键词 if script_tag.string and "Gmaps.map.markers" in script_tag.string: target_js_content = script_tag.string break if not target_js_content: print("抱歉,没找到包含Gmaps.map.markers的JS代码块!")
步骤3:用正则提取经纬度
JS里的Gmaps.map.markers通常是一个包含多个对象的数组,每个对象里有lat和lng字段(可能带引号也可能不带)。我们用正则表达式匹配这些字段的值:
# 编写正则模式,兼容带引号/不带引号、冒号/等号的写法 lat_lng_pattern = re.compile(r'lat\s*[:=]\s*([\d.-]+),\s*lng\s*[:=]\s*([\d.-]+)') # 提取所有匹配的经纬度对 matches = lat_lng_pattern.findall(target_js_content) # 整理成浮点数格式的坐标列表 coordinate_list = [] for lat_str, lng_str in matches: try: latitude = float(lat_str) longitude = float(lng_str) coordinate_list.append( (latitude, longitude) ) except ValueError: print(f"跳过无效的经纬度值:{lat_str}, {lng_str}") # 输出结果 for idx, (lat, lng) in enumerate(coordinate_list, 1): print(f"标记 {idx}:纬度 {lat},经度 {lng}")
一些注意事项
- 如果目标网站的JS代码结构比较特殊(比如标记对象嵌套更深、字段名有特殊格式),你可能需要调整正则表达式的匹配规则,比如更精准地匹配每个marker对象:
re.compile(r'\{.*?lat\s*[:=]\s*([\d.-]+).*?lng\s*[:=]\s*([\d.-]+).*?\}') - 如果遇到反爬机制,除了加
User-Agent,还可以考虑添加Cookie或者使用代理IP(视情况而定)
内容的提问来源于stack exchange,提问作者pickenpack
相关产品推荐
相关产品推荐

