无法找到尝试使用通配符的xpath列表包含文本或样式

时间:2017-10-25 07:28:16

标签: css python-3.x selenium xpath web-scraping

我正在尝试在“主要列表”下找到此站点的XPATH XPath。我到目前为止:

//div[starts-with(@class, ('sm-CouponLink_Label'))]

然而,这找到了32场比赛......

`//div[starts-with(@class, ('sm-CouponLink_Label'))]`[contains(text(),'*')or[contains(Style(),'*')] 

不幸的是,在这种情况下,我想要使用XPath而不是CSS。

这是site,我的code就在这里,这是我所追求的XP image

我也尝试过:

CSS:div:nth-child(1) > .sm-MarketContainer_NumColumns3 > div > div

Xpath equiv ...://div[1]//div[starts-with(@class, ('sm-MarketContainer_NumColumns3'))]//div//div
虽然它似乎不起作用。

已更新 工作CSS:div.sm-Market:has(div >div:contains('Main Lists')) * > .sm-CouponLink_Label

Xpath://div[Contains(@class, ('sm-Market'))]//preceding::('Main Lists')//div[Contains(@class, ('sm-CouponLink_Label'))]

尚未正常工作..

虽然我不确定Selenium是否具有以下内容:has

...替代地

类似的东西:

//div[contains(text(),"Main Lists")]//following::div[contains(@class,"sm-Market")]//div[contains(@class,"sm-CouponLink_Label")]//preceding::div[contains(@class,"sm-Market_HeaderOpen ")]

(错误的区域)

2 个答案:

答案 0 :(得分:2)

您可以使用以下代码获取所有必需元素:

league_names = [league for league in driver.find_elements_by_xpath('//div[normalize-space(@class)="sm-Market" and .//div="Main Lists"]//div[normalize-space(@class)="sm-CouponLink_Label"]') if league.text]

这应该只返回非空节点列表

答案 1 :(得分:1)

如果我理解正确,您希望进一步缩小第一个XPath的结果,只返回具有内部文本或具有属性div的{​​{1}}。在这种情况下,您可以使用以下XPath:

style

<强>更新

当您进一步澄清时,您希望获得//div[starts-with(@class, ('sm-CouponLink_Label'))][@style or text()] 课程&#39; sm-CouponLink_Label&#39;位于“主要列表”中的#39;部分。为此,您应该尝试合并主要列表&#39;以某种方式在XPath中。这是一种可能的方式(为便于阅读而格式化):

div

注意//div[ div/div/text()='Main Lists' ]//div[ starts-with(@class, 'sm-CouponLink_Label') and normalize-space() ] 如何用于从结果中过滤掉空normalize-space()。这应该按预期返回5个元素,这是我在Chrome中测试时的结果:

enter image description here