如何使用Selenium Python定位特定<li>元素获取目标数据流?
Python Selenium 精准抓取奇数行JSON数据问题
问题说明
正在学习Python版Selenium,此前已成功从实时数据流抓取JSON数据,但处理另一台格式不同的设备时遇到定位难题:网页中ul#stream下的<li>元素均带有row类,但每隔一行是无关数据,需要精准抓取第1、3、5行这类奇数行的目标数据,现有代码仅能随机获取单个row元素,无法实现精准筛选。
现有运行代码
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://server.domain/") # 输入编号并提交 element = driver.find_element(By.ID, "message") element.send_keys(box_num) element_send = driver.find_element(By.ID, "send") element_send.send_keys('\ue007') # 暂停数据流 time.sleep(1) element_pause = driver.find_element(By.ID, "pause") element_pause.send_keys('\ue007') # 尝试抓取数据(仅能获取单个row元素) element_data = driver.find_element(By.CLASS_NAME, "row") data = element_data.text
尝试的XPATH(存在局限)
原XPATH仅能匹配第一个li.row元素,无法筛选奇数行:
first_li = driver.find_element(By.XPATH, "//ul[@id='stream']/li[@class='row']") first_lit = first_li.text
解决方案:用XPATH筛选奇数行
利用XPATH的位置筛选语法,直接定位所有奇数行的li.row元素:
方法1:使用position()函数
# 获取所有奇数行的row元素 odd_rows = driver.find_elements(By.XPATH, "//ul[@id='stream']/li[@class='row'][position() mod 2 = 1]") # 遍历提取每行文本 for row in odd_rows: target_data = row.text # 后续处理JSON数据
方法2:使用odd()简写
# 更简洁的写法,直接匹配奇数位置的元素 odd_rows = driver.find_elements(By.XPATH, "//ul[@id='stream']/li[@class='row'][odd()]")
关键说明
- 使用
find_elements(复数形式)而非find_element,才能获取所有符合条件的元素; - XPATH中的
position()从1开始计数,mod 2 =1或odd()均可筛选出第1、3、5...行的元素。
内容的提问来源于stack exchange,提问作者mike2k
相关产品推荐
相关产品推荐

