大拿们,我使用selenium尝试获取一页上所有的商品名称,数据都是放在div[@id='J_goodsList']下面的li标签中的,于是我用find_elements(By.Xpath,'路径')成功获取了所有的li标签的web对象,并且返回了web对象列表。
于是下一步我用for循环给它进行了遍历,也可以成功print出遍历后的结果:
但是问题来了,我接下来用find_element(By.XPATH,'路径')要提取商品名称的时候,使用了以下代码,它就报错:“selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"./em"}(Session info: chrome=105.0.5195.125)”
请问一下我要怎么解决这个问题?
for循环遍历后的每个元素使用这个方法:find_element(By.XPATH,'路径'), 而不是driver, 如果还是报错,把你的代码贴一下
这个问题很简单,报错原因肯定就是xpath有问题,没有找到元素,根据我的看法,你应该分析一下你这个放循环里的所有xpath是否一致,这种情况很大概率是里面有一两个节点,与其他的xpath不一致,所以你for循环的时候循环到那一条数据定位会出错!
这种报错也基本上就是这种问题,检查你的xpath就好了,然后开发者工具打开那个list下的节点,看一看li标签路径是不是都一样!
额外建议,可以结合一个插件叫xpath helper,同时,直接鼠标右键复制xpath,结合这个插件校验就行了,不用自己写了,自己写很费劲🐶
根据你的代码改了下,31行不加s是因为只需要获取网页中那一个
ul中的内容,32行加s是因为有多个li节点,需要获取所有li节点
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# path = 'chromedriver.exe'
# driver = webdriver.Chrome(path)
driver = webdriver.Chrome()
url = 'https://www.jd.com'
driver.get(url)
time.sleep(1)
# 获取输入框元素,输入'iphone'
driver.find_element(By.XPATH, '//*[@id="key"]').send_keys('iphone')
# 获取'搜索'按钮元素,点击'搜索'按钮
driver.find_element(By.XPATH, '//*[@id="search"]/div/div[2]/button/i').click()
time.sleep(1)
# 定义一个函数,用来下拉页面,用selenium去驱动js代码
def drop_down():
for x in range(1, 12, 2):
time.sleep(1)
j = x / 9
js = 'document.documentElement.scrollTop= document.documentElement.scrollHeight * %f' % j
driver.execute_script(js)
# 获取数据部分,所有的数据都在li标签里面
def get_shop_info():
drop_down()
li_list = driver.find_element(By.XPATH, '//div[@id="J_goodsList"]/ul')
name = li_list.find_elements(By.XPATH, '//div/div[4]/a/em')
for i in name:
i1 = i.text
print(i1)
if __name__ == '__main__':
get_shop_info()
driver.quit()
应该是xpath有问题
no such element 已经说明问题了 找不到对应的元素,要么实际就不存在要么检索参数有问题