我有如下的html。我希望那些webelments通过CSSselector或xpath不具备div<类="锁定" 谁能帮我。输出应该是两个元素 "我是免费的视频1" &安培;我是免费视频2。
锁定视频
x[m]
免费视频1
<div class="item video " data-reactid="165">
<a href="/video/peppa/xyz" data-reactid="166">
<div class="LazyLoad is-visible" style="height:168px;" data-reactid="167">
<img class="visual-video" src="https://abc.jpg?w=300" alt="I am locked video">
</div>
<p class="text" data-reactid="168">Episodio completo</p>
<img class="video" src="/images/icon-video.svg" data-reactid="169">
<div class="locked" data-reactid="170">
<div class="opaque" data-reactid="171"></div>
<p data-reactid="172">Activa tu cuenta</p>
</div>
</a>
<p class="name" data-reactid="173">I am locked video</p>
</div>
免费视频2
<div class="item video " data-reactid="185">
<a href="/video/ghi" data-reactid="186">
<div class="LazyLoad is-visible" style="height:168px;" data-reactid="187">
<img class="visual-video" src="https://ghi.jpg?w=300" alt="I am free video1">
</div>
<p class="text" data-reactid="188">Episodio completo</p>
<img class="video" src="/images/icon-video.svg" data-reactid="189">
</a>
<p class="name" data-reactid="190">I am free video1</p>
</div>
答案 0 :(得分:1)
这对XPath来说相对简单:
//div[contains(@class, 'video') and not(div[@class='locked'])]
请注意,严格来说,为避免误报,您应该handling the class
attribute values properly:
//div[contains(concat(' ', @class, ' '), ' video ') and
not(div[contains(concat(' ', @class, ' '), ' locked ')])]
答案 1 :(得分:0)
如果您的CSS实现支持:not()
“伪元素”选择器,那么您可以尝试
.item.video:not(div.locked) p.name
比照https://www.w3.org/wiki/CSS/Selectors/pseudo-classes/:not
这可能过于具体,因为我不理解加价的背景。
对于XPath,我认为它会是这样的:
//div[contains(@class, 'video') and not(.//div[contains(@class, 'locked')])]//p[contains(@class,'name')
答案 2 :(得分:0)
这些文本是否不变?如果是,那么您可以从文本中获取元素。
How do I find an element that contains specific text in Selenium Webdriver (Python)?
答案 3 :(得分:0)
这是一个有趣的问题,我提出了一个想法。
我的想法是首先捕获所有视频,然后从所有视频列表中删除锁定的视频。代码如下,
//Gather all the videos
List<WebElement> all = driver.findElements(By.xpath("//div[@class,'item video']/a"));
//Gather the videos which has locked
List<WebElement> locked = driver.findElements(By.xpath("//div[@class,'item video']//div[@class,'locked']"));
//Remove the locked videos from all videos
for(WebElement lock : locked)
{
all.remove(lock);
}
//Now "all" contains only the free videos.
for(WebElement free : all)
{
//Do the stuff
}
注意 - 未经测试。如果有效,请检查并告诉我