如何在for循环的XPath语句中插入变量实现Selenium批量爬取
问题原因
你的XPath字符串中的i是固定文本内容,并不会自动关联读取Python for循环中的i变量,因此无法实现动态索引效果。额外注意:XPath的索引规则是从1开始计数,而Python的range()生成的序列默认从0开始,直接使用循环变量i会出现索引偏移错误。
另外你的代码存在一个隐藏问题:你用了内置函数名range作为自定义变量名,会覆盖Python内置的range功能,后续代码如果再调用range()会报错,同时你点击按钮后不需要接收返回值,这行的变量赋值可以直接去掉。
解决方法
使用字符串格式化将Python的循环变量动态插入到XPath字符串中,推荐使用Python3.6+支持的f-string写法,语法简洁易读:
import time from bs4 import BeautifulSoup # 前面的driver初始化等代码你自己保留 for i in range(length): driver.execute_script("window.history.go(-1)") # 加等待保证页面回退后元素加载完成,可根据自己的网络情况调整时长 time.sleep(1) # 用f-string插入变量,注意XPath从1开始所以要i+1 driver.find_element_by_xpath(f"(//a[@class = 'button'])[{i+1}]").click() # 点击后同样加等待保证详情页加载完成 time.sleep(2) content2 = driver.page_source.encode('utf-8').strip() soup2 = BeautifulSoup(content2,"html.parser") name2 = soup2.find('h1', {'data-qa-target': 'ProviderDisplayName'}).text phone2 = soup2.find('a', {'class': 'click-to-call-button-secondary hg-track mobile-click-to-call'}).text print(name2, phone2)
如果你的Python版本低于3.6不支持f-string,可以用字符串拼接的写法替换XPath那行:
driver.find_element_by_xpath("(//a[@class = 'button'])[" + str(i+1) + "]").click()
内容的提问来源于stack exchange,提问作者Adrian Reichert
相关产品推荐
相关产品推荐

