Python Selenium:根据span文本获取同级链接的实现求助
根据Span文本匹配获取对应链接
方法1:直接用XPath正则匹配(现代浏览器支持)
直接在XPath中集成文本匹配规则,精准定位符合条件的<span>,再获取其对应的前置<a>标签:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 匹配文本为「数字+A」格式的span,获取对应前置链接 target_links = [ elem.get_attribute("href") for elem in WebDriverWait(driver, 30).until( EC.visibility_of_all_elements_located( (By.XPATH, "//span[contains(@class, 'class_name') and matches(text(), '^\\d+A$')]/preceding-sibling::a[@href][1]") ) ) ]
matches(text(), '^\d+A$'):XPath 2.0正则语法,确保span文本是纯数字加A的格式(如00A、01A),若允许文本前后有空白,可调整为^\s*\d+A\s*$preceding-sibling::a[@href][1]:取当前span的最近一个前置a标签,避免匹配到更早的无关链接
方法2:Python正则二次筛选(全环境兼容)
若环境不支持XPath正则,可先获取所有span与对应链接的配对,再用Python正则做过滤:
import re from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 获取所有目标span元素 spans = WebDriverWait(driver, 30).until( EC.visibility_of_all_elements_located((By.XPATH, "//span[contains(@class, 'class_name')]")) ) target_links = [] # 定义「数字+A」的匹配规则 match_pattern = re.compile(r'^\d+A$') for span in spans: clean_text = span.text.strip() if match_pattern.match(clean_text): # 获取当前span对应的前置链接 link_element = span.find_element(By.XPATH, "./preceding-sibling::a[@href][1]") target_links.append(link_element.get_attribute("href"))
- 先批量获取所有目标span,再用Python的
re模块做正则校验,兼容性更强 ./preceding-sibling::a[@href][1]:通过.限定当前节点范围,确保只匹配当前span的前置链接
补充:获取所有Span文本的方法
如果需要先导出所有span文本做检查,可使用以下代码:
spans = WebDriverWait(driver, 30).until( EC.visibility_of_all_elements_located((By.XPATH, "//span[contains(@class, 'class_name')]")) ) all_span_texts = [span.text.strip() for span in spans] print(all_span_texts)
内容的提问来源于stack exchange,提问作者xvmodvx
相关产品推荐
相关产品推荐

