相关文章推荐
发财的李子  ·  Unable to create ...·  10 月前    · 

Selenium :获取一个元素内的文本,但不获取其中嵌套标签内的文本

1 人关注

比方说,我有一个元素

<div class="ProductVariants__PriceContainer-sc-1unev4j-9 jjiIua">
    <span class="ProductVariants__MRPText-sc-1unev4j-10 jEinXG">
    </span>
    <div class="Product__Dicount">
        No discount available for this product

当我通过类名来获取元素时

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

This gives me

'₹199 ₹690 No discount available for this product'

我想要的只是₹199

请注意,我不能只是格式化文本,并通过space获得分割上的第一个文本,因为页面的结构一直在变化。

2 个评论
对于给定的HTML,我认为你得到的是 ₹199 ₹690 No discount available for this product
@undetected Selenium编辑了很多页面,所以在复制粘贴时出现了一些错误,抱歉。
python
selenium
selenium-webdriver
css-selectors
selenium-chromedriver
Himanshuman
Himanshuman
发布于 2022-07-06
4 个回答
Firelord
Firelord
发布于 2022-07-06
已采纳
0 人赞同

Using little bit 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)

Output:

我们用JS所做的是,我们正在获取我们的目标div元素的所有子节点。然后我们遍历所有这些节点,从这些节点中获取textContent的值。text节点。同时,我们将所有这些值加入一个字符串类型的变量l。我们从JS中返回l,并在Python中剥去它的无用字符。这就是了。

JaSON
JaSON
发布于 2022-07-06
0 人赞同

@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())
    
如果可以肯定的是,价格会 始终 是父元素的第一个孩子,那么这实际上是对我的答案的一个巧妙的简化。+1
undetected Selenium
undetected Selenium
发布于 2022-07-06
0 人赞同

To print only 199 from the string ₹199 ₹690 No discount available for this product you just need to split the entire string with respect to the 并打印第二个元素,如下所示。

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])