如何从 javascript 生成的工具提示中抓取文本
How to scrape text from tooltips generated with javascript
我编写了以下代码来获取地图中所有蓝色标记的位置。
from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
url="https://emf2.bundesnetzagentur.de/karte/Default.aspx?lat=52.4107723&lon=14.2930953&zoom=14"
r = session.get(url)
r.html.render(sleep = 3)
data = r.html.html
soup=BeautifulSoup(data,'html.parser')
BlueTriangles = soup.find_all(src="images/funk_hf.png")
for Triangle in BlueTriangles[1:]:
TriangleStyle = Triangle['style']
PixelPosition = TriangleStyle.split('transform: translate3d(')[1].split(', 0px); z')[0]
print(PixelPosition)
r.session.close()
当我使用网络浏览器打开 URL 时,我看到每个蓝色标记都有一个唯一的 ID,在鼠标悬停时显示在工具提示中:
工具提示的 html 代码似乎是由鼠标悬停事件触发呈现的:
有没有办法从工具提示中抓取 ID?我想知道是否可以使用 render 的脚本参数来强制鼠标悬停事件。但是我找不到将它集成到代码中的方法:
$('#foo').trigger('mouseover');
地图上的点根据请求呈现到端点 https://emf2.bundesnetzagentur.de/karte/Standortservice.asmx/GetStandorteFreigabe 和框坐标(在本例中为 {"Box":{"sued":52.39231101879802,"west":14.248666763305664,"nord":52.42927461241364,"ost":14.337587356567385}}
)。
响应是 json。位置数据由 AES 加密。解密代码在 js 脚本加载页面时可用(函数 CryptParams 和 DecryptData)。
解密后我们得到了这个不错的数据:
"[{"Titel":"018126","Lng":14.311666,"Lat":52.428888,"fID":1076,"sonderseite":false},{"Titel":"011720","Lng":14.259722,"Lat":52.423054,"fID":2196,"sonderseite":false},{"Titel":"87011082","Lng":14.275832,"Lat":52.401666,"fID":560919,"sonderseite":false}]"
你有两种方法。
使用selenium或类似软件渲染JS并尝试解析结果DOM;
编写解析器向 GetStandorteFreigabe 端点发送请求并解码其响应(将代码从 js 转换为 python),
我编写了以下代码来获取地图中所有蓝色标记的位置。
from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()
url="https://emf2.bundesnetzagentur.de/karte/Default.aspx?lat=52.4107723&lon=14.2930953&zoom=14"
r = session.get(url)
r.html.render(sleep = 3)
data = r.html.html
soup=BeautifulSoup(data,'html.parser')
BlueTriangles = soup.find_all(src="images/funk_hf.png")
for Triangle in BlueTriangles[1:]:
TriangleStyle = Triangle['style']
PixelPosition = TriangleStyle.split('transform: translate3d(')[1].split(', 0px); z')[0]
print(PixelPosition)
r.session.close()
当我使用网络浏览器打开 URL 时,我看到每个蓝色标记都有一个唯一的 ID,在鼠标悬停时显示在工具提示中:
工具提示的 html 代码似乎是由鼠标悬停事件触发呈现的:
有没有办法从工具提示中抓取 ID?我想知道是否可以使用 render 的脚本参数来强制鼠标悬停事件。但是我找不到将它集成到代码中的方法:
$('#foo').trigger('mouseover');
地图上的点根据请求呈现到端点 https://emf2.bundesnetzagentur.de/karte/Standortservice.asmx/GetStandorteFreigabe 和框坐标(在本例中为 {"Box":{"sued":52.39231101879802,"west":14.248666763305664,"nord":52.42927461241364,"ost":14.337587356567385}}
)。
响应是 json。位置数据由 AES 加密。解密代码在 js 脚本加载页面时可用(函数 CryptParams 和 DecryptData)。
解密后我们得到了这个不错的数据:
"[{"Titel":"018126","Lng":14.311666,"Lat":52.428888,"fID":1076,"sonderseite":false},{"Titel":"011720","Lng":14.259722,"Lat":52.423054,"fID":2196,"sonderseite":false},{"Titel":"87011082","Lng":14.275832,"Lat":52.401666,"fID":560919,"sonderseite":false}]"
你有两种方法。
使用selenium或类似软件渲染JS并尝试解析结果DOM;
编写解析器向 GetStandorteFreigabe 端点发送请求并解码其响应(将代码从 js 转换为 python),