首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Selenium :在元素中获取文本,而不是在元素内的嵌套标记中获取文本

Selenium :在元素中获取文本,而不是在元素内的嵌套标记中获取文本
EN

Stack Overflow用户
提问于 2022-07-05 18:54:34
回答 3查看 243关注 0票数 1

假设我有一个元素

代码语言:javascript
运行
复制
<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>

当我用类名获取元素时

代码语言:javascript
运行
复制
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

这给了我

代码语言:javascript
运行
复制
'₹199 ₹690 No discount available for this product'

我想要的只是₹199

请注意,随着页面结构的不断变化,我不能仅仅格式化文本并获得第一个由space拆分的文本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-05 20:11:03

使用一些JS:

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
₹199

我们对JS所做的是获取目标div元素的所有子节点。然后,我们将遍历所有这些节点,并仅从文本节点获取值。同时,我们正在将所有这些值添加到字符串类型变量l中。我们从JS返回l,并去掉Python中无用的字符。就这样。

票数 2
EN

Stack Overflow用户

发布于 2022-07-05 21:02:45

@Firelord (+1)的答案可以简化为

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2022-07-05 19:01:36

要从字符串中只打印199,只需对整个字符串进行拆分,然后按如下方式打印第二个元素:

代码语言:javascript
运行
复制
print(div_containing_radio.find_element(by=By.CSS_SELECTOR, value=".ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua").text.split("₹")[1])

作为另一种选择,您还可以拆分与blankspace相关的字符串,并按如下方式打印第一个元素:

代码语言:javascript
运行
复制
print(div_containing_radio.find_element(by=By.CSS_SELECTOR, value=".ProductVariants__PriceContainer-sc-1unev4j-9.jjiIua").text.split(" ")[0])    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72874278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档