如何结合find_all与find_elements_by_xpath提取并筛选指定页面元素?
解决eBay元素筛选问题:结合正则属性匹配与文本关键词过滤
方案1:纯Selenium用XPath一步完成筛选
直接通过XPath同时匹配data-test-id前缀和目标关键词(不区分大小写),无需分步处理:
核心XPath语句
//span[starts-with(@data-test-id, 'fdbk-item-') and (contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'mirror') or contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'tray') or contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'ceramic'))]
starts-with(@data-test-id, 'fdbk-item-'):匹配以fdbk-item-开头的属性值translate(text(), 大写字母集, 小写字母集):将文本统一转为小写,实现不区分大小写匹配contains(...):检查文本是否包含目标关键词
完整代码示例
from selenium import webdriver driver = webdriver.Chrome() driver.get("你的eBay目标链接") # 直接定位符合条件的元素 target_spans = driver.find_elements_by_xpath("//span[starts-with(@data-test-id, 'fdbk-item-') and (contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'mirror') or contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'tray') or contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'ceramic'))]") # 提取并打印结果文本 for span in target_spans: print(span.text.strip()) driver.quit()
方案2:BeautifulSoup提取后再筛选
如果已经完成第一步的BeautifulSoup提取,可以直接在Python层面做文本过滤:
from bs4 import BeautifulSoup import requests url = "你的eBay目标链接" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 第一步:提取符合data-test-id规则的span元素 raw_spans = soup.find_all( "span", attrs={"data-test-id": lambda x: x and x.startswith("fdbk-item-")} ) # 第二步:筛选包含目标关键词的元素(不区分大小写) target_keywords = {"mirror", "tray", "ceramic"} filtered_spans = [] for span in raw_spans: span_text = span.get_text(strip=True).lower() if any(keyword in span_text for keyword in target_keywords): filtered_spans.append(span) # 输出结果 for span in filtered_spans: print(span.get_text().strip())
方案3:Selenium处理动态页面 + BeautifulSoup筛选
如果页面是动态加载的(需要Selenium渲染),可以先获取渲染后的源码,再用BeautifulSoup处理:
from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome() driver.get("你的eBay目标链接") # 获取渲染后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 后续筛选逻辑同方案2 raw_spans = soup.find_all( "span", attrs={"data-test-id": lambda x: x and x.startswith("fdbk-item-")} ) target_keywords = {"mirror", "tray", "ceramic"} filtered_spans = [] for span in raw_spans: span_text = span.get_text(strip=True).lower() if any(keyword in span_text for keyword in target_keywords): filtered_spans.append(span) for span in filtered_spans: print(span.get_text().strip()) driver.quit()
内容的提问来源于stack exchange,提问作者ykpcat
相关产品推荐
相关产品推荐

