尝试XPath选择启用状态div失败,求可行实现方案?
解决方案
1. 使用CSS选择器(推荐)
CSS选择器在类匹配上更简洁精准,直接排除禁用类即可:
/* 匹配包含目标类、排除禁用类,且文本为Intraday的div */ div.buySellOrder_bso21ProductOption__9UpPt:not(.buySellOrder_bso21MisDisabled__86CjY):contains(Intraday)
如果你的环境不支持:contains()伪类(比如部分爬虫工具),可以先匹配类,再通过文本过滤:
div.buySellOrder_bso21ProductOption__9UpPt:not(.buySellOrder_bso21MisDisabled__86CjY)
2. 改进XPath表达式
原XPath的contains(@class)可能因类名的空格/顺序问题导致误匹配,改用完整类名匹配的方式:
//div[ contains(concat(' ', normalize-space(@class), ' '), ' buySellOrder_bso21ProductOption__9UpPt ') and not(contains(concat(' ', normalize-space(@class), ' '), ' buySellOrder_bso21MisDisabled__86CjY ')) and normalize-space(text()) = 'Intraday' ]
concat(' ', normalize-space(@class), ' '):给处理后的类列表前后加空格,确保匹配的是完整类名,避免部分类名重叠导致的误判normalize-space(text()):去除文本前后的空格,精准匹配"Intraday"
3. XPath 2.0+ 专用写法(支持时使用)
如果你的环境支持XPath 2.0及以上,用tokenize拆分类列表更可靠:
//div[ some $class in tokenize(@class, '\s+') satisfies $class = 'buySellOrder_bso21ProductOption__9UpPt' and not(some $class in tokenize(@class, '\s+') satisfies $class = 'buySellOrder_bso21MisDisabled__86CjY') and normalize-space(text()) = 'Intraday' ]
内容的提问来源于stack exchange,提问作者kajezevu
相关产品推荐
相关产品推荐

