如何用Python获取网站地图导航容器数据?现有代码返回NO DATA求助
解决动态页面爬取壁画数据的问题
我正在学习Python,希望从指定网站的地图导航容器中获取壁画ID、纬度、经度、艺术家姓名、地址、城市和州等信息。以下是我尝试过的代码,但输出始终为NO DATA,恳请各位提供帮助!
from bs4 import BeautifulSoup import requests url = 'https://findmasa.com/view/map#b1cc410b' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') li_element = soup.find('li', id='b1cc410b') if li_element: data_lat = li_element['data-lat'] data_lng = li_element['data-lng'] artist_name = li_element.find('a').text address = li_element.find_all('p')[1].text city = li_element.find_all('p')[2].text print('LATITUDE ', data_lat) print('LONGITUDE ', data_lng) print('ARTIST ', artist_name) print('ADDRESS ', address) print('CITY ', city) else: print('NO DATA')
问题原因
你用requests获取的是静态HTML内容,但该网站的地图数据是通过JavaScript动态渲染加载的,静态HTML里并没有你要找的li#b1cc410b元素,所以BeautifulSoup无法定位到目标节点,最终输出NO DATA。
解决方案
使用Selenium模拟浏览器加载页面,它会等待JavaScript执行完成,获取到动态渲染后的完整页面内容。
步骤
- 安装Selenium库和对应浏览器的驱动(比如ChromeDriver)
- 编写代码模拟浏览器访问页面,等待元素加载后提取数据
示例代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://findmasa.com/view/map#b1cc410b' # 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver = webdriver.Chrome() driver.get(url) try: # 等待目标li元素加载完成,最多等待10秒 li_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'b1cc410b')) ) # 提取所需数据 mural_id = li_element.get_attribute('id') data_lat = li_element.get_attribute('data-lat') data_lng = li_element.get_attribute('data-lng') artist_name = li_element.find_element(By.TAG_NAME, 'a').text paragraphs = li_element.find_elements(By.TAG_NAME, 'p') address = paragraphs[1].text city_state = paragraphs[2].text city, state = city_state.split(', ') # 输出结果 print('壁画ID ', mural_id) print('纬度 ', data_lat) print('经度 ', data_lng) print('艺术家 ', artist_name) print('地址 ', address) print('城市 ', city) print('州 ', state) finally: # 关闭浏览器 driver.quit()
补充说明
- 若使用Firefox等其他浏览器,需替换为对应驱动(如GeckoDriver)和初始化代码(
webdriver.Firefox()) - 确保驱动版本与浏览器版本匹配,避免兼容性问题
- 也可尝试分析网站的XHR网络请求,直接调用后端API获取数据,这种方式更高效,但需要自行定位数据接口
内容的提问来源于stack exchange,提问作者Jessie H
相关产品推荐
相关产品推荐

