假设我有一个元素
<div class="ProductVariants__PriceContainer-sc-1unev4j-9 jjiIua">
₹199
<span class="ProductVariants__MRPText-sc-1unev4j-10 jEinXG">
₹690
</span>
<div class="Product__Dicount">
No discount available for this product
</div>
</div>
当我用类名获取元素时
div_containing_radio = driver.find_element(by=By.XPATH, value="//div[starts-with(@class, 'ProductVariants__RadioButtonInner')]//ancestor::div[starts-with(@class, 'ProductVariants__VariantCard')]")
div_containing_radio.find_element(by=By.CSS_SELECTOR, value=".ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua").text
这给了我
'₹199 ₹690 No discount available for this product'
我想要的只是₹199
。
请注意,随着页面结构的不断变化,我不能仅仅格式化文本并获得第一个由space
拆分的文本。
发布于 2022-07-05 12:11:03
使用一些JS:
js_query = """
var x = document.querySelector('.ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua').childNodes;
var l = "";
x.forEach(i => {
if (i.nodeName === '#text') {
l += ' ' + i.textContent;
}
});
return l;
"""
price = driver.execute_script(js_query).strip()
print(price)
输出:
₹199
我们对JS所做的是获取目标div元素的所有子节点。然后,我们将遍历所有这些节点,并仅从文本节点获取值。同时,我们正在将所有这些值添加到字符串类型变量l
中。我们从JS返回l
,并去掉Python中无用的字符。就这样。
发布于 2022-07-05 13:02:45
@Firelord (+1)的答案可以简化为
div_containing_radio = driver.find_element(by=By.XPATH, value="//div[starts-with(@class, 'ProductVariants__RadioButtonInner')]//ancestor::div[starts-with(@class, 'ProductVariants__VariantCard')]")
price = div_containing_radio.find_element(by=By.CSS_SELECTOR, value=".ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua")
print(driver.execute_script("return arguments[0].firstChild.textContent;", price).strip())
发布于 2022-07-05 11:01:36
要从字符串₹
中只打印199
,只需对整个字符串进行拆分,然后按如下方式打印第二个元素:
print(div_containing_radio.find_element(by=By.CSS_SELECTOR, value=".ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua").text.split("₹")[1])
作为另一种选择,您还可以拆分与blankspace
相关的字符串,并按如下方式打印第一个元素:
print(div_containing_radio.find_element(by=By.CSS_SELECTOR, value=".ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua").text.split(" ")[0])
https://stackoverflow.com/questions/72874278
复制