Python Selenium中如何给XPath传入多个变量?元素定位问题
如何在XPath中传入两个变量定位区间元素?
我正在编写Python代码,用XPath定位'SECTION A'与'SECTION B'之间的元素,原代码如下:
driver.find_elements("xpath", "//*[preceding-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'SECTION A')]] and following-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'SECTION B')]]]//span[normalize-space(text()) and contains(@class,'label')] ")
现在想要实现定位任意两个区间(比如SECTION B与SECTION C等)之间的元素,打算编写一个可传入起始section和结束section参数的函数,但不知道怎么修改代码让XPath支持传入两个变量。我知道可以用%s,但以为它仅支持单个变量,当前尝试的代码如下:
driver.find_elements("xpath", "//*[preceding-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'%s')]] and following-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'SECTION B')]]]//span[normalize-space(text()) and contains(@class,'label')] "%firstsection) #如何给'SECTION B'传入secondsection变量?
解决方法
其实%s支持传入多个变量,只需要在字符串末尾的元组里按顺序传入对应参数即可。除此之外,还可以用更简洁的f-string或者str.format()方法,以下是三种实现方式:
1. 多变量%s格式化
def get_elements_between_sections(driver, first_section, second_section): xpath = "//*[preceding-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'%s')]] and following-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'%s')]]]//span[normalize-space(text()) and contains(@class,'label')]" % (first_section, second_section) return driver.find_elements("xpath", xpath)
2. f-string格式化(Python 3.6+推荐)
这种方式可读性更强,直接在字符串里嵌入变量:
def get_elements_between_sections(driver, first_section, second_section): xpath = f"//*[preceding-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'{first_section}')]] and following-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'{second_section}')]]]//span[normalize-space(text()) and contains(@class,'label')]" return driver.find_elements("xpath", xpath)
3. str.format()方法
兼容性更好,适合Python 3.6之前的版本:
def get_elements_between_sections(driver, first_section, second_section): xpath = "//*[preceding-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'{}')]] and following-sibling::div[contains(@class,'titleWrap') and .//div[contains(@data-section-name,'{}')]]]//span[normalize-space(text()) and contains(@class,'label')]".format(first_section, second_section) return driver.find_elements("xpath", xpath)
使用时直接调用函数即可,比如:
elements = get_elements_between_sections(driver, "SECTION B", "SECTION C")
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

