如何用Python从含JS代码的网页文本中提取所有坐标值?
从网页JavaScript代码中提取坐标值的解决方案
核心思路
坐标值本质是带小数的数值,通常成对出现(纬度、经度),可以直接用正则表达式匹配符合格式的数值,无需深入解析JavaScript语法结构。
具体实现步骤
假设你已经通过requests和BeautifulSoup获取到网页内容,接下来按以下步骤操作:
1. 提取所有JavaScript代码块
先把页面中所有<script>标签的内容提取出来:
import requests from bs4 import BeautifulSoup import re # 你已有的网页抓取代码 target_url = "你的目标网页URL" resp = requests.get(target_url) soup = BeautifulSoup(resp.text, "html.parser") # 提取所有非空的script标签内容 script_blocks = [block.string for block in soup.find_all("script") if block.string]
2. 正则匹配坐标数值
用正则匹配符合坐标格式的数值(支持正负号、整数+小数结构):
# 匹配坐标的正则:可选负号 + 整数部分 + 小数点 + 小数部分 coord_regex = re.compile(r"-?\d+\.\d+") # 收集所有匹配到的坐标 all_coordinates = [] for block in script_blocks: matches = coord_regex.findall(block) if matches: all_coordinates.extend(matches) # 转换为浮点数(按需选择) all_coordinates = [float(coord) for coord in all_coordinates]
3. 按需处理坐标对(可选)
如果坐标是按「纬度,经度」成对出现的,可以把列表按每两个元素分组:
# 分组为(lat, lon)元组 coord_pairs = [(all_coordinates[i], all_coordinates[i+1]) for i in range(0, len(all_coordinates), 2)]
优化与过滤
如果页面中存在其他带小数的数值(如价格、距离)导致误匹配,可以通过坐标的合法范围过滤:
filtered_coords = [] for num in all_coordinates: # 纬度范围:-90~90,经度范围:-180~180 if (-90 <= num <= 90) or (-180 <= num <= 180): filtered_coords.append(num)
注意:如果网页坐标被加密(如字符串拼接、Base64编码),需要先分析对应JavaScript代码的解码逻辑,再针对性处理。
内容的提问来源于stack exchange,提问作者Shemavi beat.
相关产品推荐
相关产品推荐

