如何用Selenium的find_elements获取innerHTML,解决谷歌地图爬取价格重复问题
谷歌地图爬取价格文本的问题解决
核心问题分析
循环输出值始终相同的核心原因是使用绝对XPath而非相对路径,导致每次循环都定位到页面同一个元素;另外find_elements返回元素列表,不能直接调用.text方法。要实现批量获取价格文本,需基于每个entry节点做相对定位,再通过find_elements遍历提取innerHTML。
代码修正及说明
关键问题修正
- 绝对XPath改相对路径:所有基于
entry的元素查找,XPath需以.开头,表示从当前entry节点开始搜索,而非整个页面根节点。 find_elements正确用法:find_elements返回元素列表,需遍历或通过索引获取单个元素后,再调用.get_attribute('innerHTML')或.text。- 补充价格提取逻辑:新增价格元素的定位代码,确保循环中每个
entry对应自身的价格数据。
修正后的代码
# 从结果中提取信息 for entry in entries: # 提取名称 name = entry.get_attribute("aria-label") # 提取地址(使用相对XPath,避免绝对路径的固定定位) adress = entry.find_element(By.XPATH, './/div[contains(@class, "W4Efsd") and position()=3]') adress_get = adress.get_attribute('innerHTML') # 提取电话(处理find_elements返回的列表) phone_elements = entry.find_elements(By.CLASS_NAME, 'xwpmRb.qisNDe') phone = phone_elements[0].text if phone_elements else "无电话信息" # 提取网站 try: webcontainer = entry.find_element(By.CLASS_NAME, 'W4Efsd') website = webcontainer.get_attribute('innerHTML') except NoSuchElementException: website = "未找到网站" # 提取价格文本(替换成你实际找到的价格元素class或定位规则) price_elements = entry.find_elements(By.CLASS_NAME, 'your-price-class') price = price_elements[0].get_attribute('innerHTML') if price_elements else "无价格信息" # 输出当前条目信息 print(name) print(adress_get) print(phone) print(website) print(price)
注意事项
- 元素定位稳定性:谷歌地图页面元素的class、XPath经常变动,建议用
contains()匹配部分class属性,避免依赖固定id或绝对路径。 - 空值处理:对
find_elements返回的列表必须做非空判断,防止索引越界报错。 - 数据存储优化:如果需要保存多条数据,建议在循环外初始化列表,循环内将每个条目的信息存入列表,避免每次循环重置数据结构。
内容的提问来源于stack exchange,提问作者what.a.disaster
相关产品推荐
相关产品推荐

