如何从使用javascript生成的工具提示中抓取文本

时间:2020-02-03 12:32:32

标签: javascript python web-scraping python-requests-html

我编写了以下代码来获取地图上所有蓝色标记的位置。

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,该ID会在鼠标悬停时显示在工具提示中:

enter image description here

工具提示的html代码似乎是由鼠标悬停事件触发的:

enter image description here

有什么方法可以从工具提示中刮除ID?我想知道是否有可能使用render的script参数来强制发生鼠标悬停事件。但是我找不到将其集成到代码中的方法:

$('#foo').trigger('mouseover');

1 个答案:

答案 0 :(得分:2)

地图上的点是根据请求呈现给具有框坐标的端点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}]"

您有两种方法。

  1. 使用硒或类似软件渲染JS并尝试解析结果DOM;

  2. 编写解析器以将请求发送到GetStandorteFreigabe端点并解码其响应(将代码从js转换为python),