Python Selenium网页爬取:如何用XPath获取前2个后续兄弟元素
解决方法
你的代码存在两个核心问题:
- XPATH语法错误:定位separator元素的表达式
//*(@class, 'separator')]写法错误,正确格式应为//*[@class='separator']。 - 内部查询使用绝对路径:
//开头的XPATH会从整个文档根节点重新查找,导致每次循环都获取所有separator对应的p元素,而非当前元素的后续兄弟。
修正后的代码方案
可以通过相对路径一次性获取每个separator后的前2个p元素,再提取文本整理成目标格式:
from selenium.webdriver.common.by import By result = [] # 定位所有class为separator的元素 separators = driver.find_elements(By.XPATH, "//*[@class='separator']") for sep in separators: # 用相对路径查找当前元素之后的前2个p同级元素 p_elements = sep.find_elements(By.XPATH, "./following-sibling::p[position()<=2]") # 提取文本并清理多余的引号和空格 texts = [p.text.strip().strip('"') for p in p_elements] result.append(texts) print(result) # 输出结果:[['sometext1', 'someothertext1'], ['sometext2', 'someothertext2']]
关键细节说明
./following-sibling::p:./表示从当前元素(sep)开始定位,following-sibling选取当前元素之后的同级元素,p限定只匹配p标签。[position()<=2]:直接筛选出前2个符合条件的p元素,比分别定位第1、第2个元素更简洁。- 文本处理:
strip().strip('"')用于去除文本前后的空格和多余引号,匹配你需要的结果格式。
如果需要分别获取第1和第2个元素,也可以这么写:
for sep in separators: t1 = sep.find_element(By.XPATH, "./following-sibling::p[1]").text.strip().strip('"') t2 = sep.find_element(By.XPATH, "./following-sibling::p[2]").text.strip().strip('"') result.append([t1, t2])
注意:若页面存在separator元素后不足2个p的情况,建议使用find_elements(复数形式)避免抛出找不到元素的异常,再根据实际长度做判断处理。
内容的提问来源于stack exchange,提问作者econbuffin2019
相关产品推荐
相关产品推荐

