Python - 从 Selenium 中 ::before 伪元素上的 CSS 属性“content”获取文本?

2023-11-30

我正在尝试抓取一些元素并返回网页上显示的文本。我相信我可以通过 css_selectors 和 xpaths 很好地找到元素,但我无法返回所需的文本。下面是我的程序:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import time
import threading
import pandas as pd

threadLocal = threading.local()

def instantiate_chrome():
    driver = getattr(threadLocal, 'driver', None)

    if driver is None:
        options = webdriver.ChromeOptions()
        options.add_argument('log-level=3')
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--ignore-ssl-errors')
        driver = webdriver.Chrome(executable_path = r'path/to/chrome', options = options)
        setattr(threadLocal, 'driver', driver)

    return driver

def search_stock(driver, stock):
    search_url = r'https://www.forbes.com/search/?q=' + stock
    driver.get(search_url)
    time.sleep(2)
    driver.find_element_by_xpath(r'/html/body/div[1]/main/div[1]/div[1]/div[4]/div/div[1]/div/div[1]/a[1]').click()

def get_q_score(stock, driver):

    df = pd.DataFrame(columns = ['stock','overall_score','quality', 'momentum','growth','technicals'])
    time.sleep(3)
    overall_score = driver.find_element_by_css_selector(r'.q-factor-total .q-score-bar__grade-label').text
    quality_score = driver.find_element_by_xpath(r'/html/body/div[1]/main/div/div[1]/div[4]/div[2]/div[2]/div[1]/div[2]/div[1]').text

    return print('overall score is '+ overall_score, ' quality score is ' + quality_score)

def main(stock):
    driver = instantiate_chrome()
    print('attempting to get q score for ' + stock)
    search_stock(driver, stock)
    print('found webpage for ' + stock)
    get_q_score(stock, driver)

main('AAPL')

我认为问题是我试图通过 selenium 的 .text 方法抓取文本,但没有要抓取的文本。有什么想法吗?


除了您提到的文字实际上并非如此之外,您走在正确的道路上text. These texts实际上是由一个渲染的CSS属性称为content只能与伪元素一起使用:before and :after。你可以阅读here如果您有兴趣的话,可以了解它是如何工作的。

文本呈现为图标;有时组织这样做是为了避免合理的价值观被忽视scraped。然而,有一种方法(有点困难)可以解决这个问题。使用Selenium and javascript您可以单独定位CSS财产的价值content其中它保存着您所追求的值。

研究了一个小时这是最简单的pythonic获得您想要的值的方法

overall_score = driver.execute_script("return [...document.querySelectorAll('.q-score-bar__grade-label')].map(div => window.getComputedStyle(div,':before').content)") #key line in the problem

代码简单地创建了一个javascript目标代码classes的元素,然后映射div元素的值CSS特性。 这会返回一个列表

['"TOP BUY"', '"B"', '"B"', '"B"', '"A"']

值,按以下顺序对应

Q-Factor Score/Quality/Momentum/Growth/Technicals

要访问列表的值,您可以使用for循环和indexing选择值。你可以看到更多相关内容here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python - 从 Selenium 中 ::before 伪元素上的 CSS 属性“content”获取文本? 的相关文章

随机推荐

  • jquery 一个滑块控制另一个

    如何让一个 jquery ui 滑块控制另一个 如果我滑动滑块 1 它也应该滑动滑块 2 创建滑块 1 时提供滑动 更改函数 该函数使用滑块 1 上正在更改的手柄的 ui value 并设置滑块 2 上的手柄值 根据滑块的手柄数量 您需要调
  • 强制使用 const 对象的 C++ 类

    首先让我问一个一般性问题 在我看来 C 是一种语言 其目的是提供大量功能 为程序员提供最大可能的灵活性 以他认为合适的方式做事 换句话说 它是一种灵活的语言 它允许程序员以比我见过的任何其他语言更多的方式表达自己 这是正确的吗 然后是具体的
  • static_cast(*this) 和 static_cast(*this) 之间的区别

    在下面的代码中 取自Effective C class A char operator std size t position now just calls const op return const cast
  • 如何正确调用setListAdapter

    我已经搜索了很多如何解决这个问题 但没有得到任何结果 我需要的唯一帮助是 请看一下 stackoverflow 上提出的这个问题和答案 这是来自的问题this link 我的活动不扩展 ListActivity 因此此行会引发错误 setL
  • 获取进程/线程的上下文切换次数

    出于好奇 我想知道我的程序被操作系统切换了多少次上下文 就像所有寄存器都被保存并且控制权被传递给另一个进程或线程一样 然后一段时间后一切都恢复了 我们继续 因为它从未发生过 系统是否在某个地方维护了这样的数字 或者是否存在某种黑客行为或其他
  • 将标签与其各自的字段 Swing 一起排列

    我需要将所有字段与相应的标签对齐 这是我的代码 public class Progress extends JPanel implements ActionListener public JLabel ClientIP JTextField
  • 错误渲染视图:java.lang.IllegalStateException:已为此响应调用 getOutputStream()

    我正在 JSF 和 spring 中创建一个项目 其主要目的是在浏览器中生成 PDF 文件 一切看起来都很好 也生成了 pdf 但在控制台上我遇到了这个异常 有人对此有任何想法吗 我搜索了一下 发现很多人都有这个问题 但我没有找到适合我的问
  • CSS、嵌套 div 和边距与填充

    我完全理解盒子模型 这个问题更多的是试图确定关于何时使用边距和何时使用填充的语义方法 这是一个典型的例子 首先 用简单的英语来说 情况 我们有一个容器div 里面有一个段落元素 目标 在 div 内部和段落外部之间有 12px 的空间 选项
  • C# Windows Universal 10 TopMost 窗口

    我正在开发一个 Windows 10 通用应用程序 UWP 是否可以将应用程序设置为 TopMost 始终位于顶部 喜欢WPF or Winforms 最上面的属性 Thanks Creators Update 中添加了一项名为 Compa
  • 映射两个列表[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我最近问了一个关于使用apply函数作用于两个列表 每
  • 什么 SQL 查询或视图将显示“动态列”

    我有一个数据表 我允许人们向该表添加元数据 我为他们提供了一个界面 允许他们将其视为向存储数据的表添加额外的列 但实际上我将数据存储在另一个表中 Data Table DataID Data Meta Table DataID MetaNa
  • CSS 元素恢复默认样式

    CSS 中有没有一种快速的方法来删除应用于元素的所有样式 例如 假设某种选项卡菜单 div class outer div div div div div div div div div CSS 应用 outer foo blee bar
  • 自定义地图功能 - 它是如何工作的?

    对于不清楚的主题标题 我深表歉意 我在计划中有这个函数 它是map功能 它工作得很好 但我在试图理解它时迷失了方向 define my map proc ls letrec iter lambda proc ls0 if null ls0
  • C++ 使用多个分隔符分解字符串[重复]

    这个问题在这里已经有答案了 可能的重复 C 中通过多个分隔符将字符串拆分为单词 我目前正在尝试读取一个文件 其中每行都有不同的制表符和空格 用于分隔需要插入二叉树中的关键属性 我的问题是 如何仅使用 STL 使用多个分隔符分割一行 在一天的
  • document.elementFromPoint(x,y) 获取 iframe 内的元素

    我试图获取 html 页面中的元素 我使用 document elementFromPoint x y 来检测输入元素 当没有 iframe 时它工作正常 但在 iframe 内部 它在这段代码中不起作用 html如下 我错过了什么吗 di
  • RequireJS 未加载名为“module.js”的文件或模块

    我刚刚开始使用 RequireJS 我尝试了一个简单的代码 但一种方法有效 但另一种方法无效 文件夹 script 有 main js module js require js 在 main js 中 requirejs module fu
  • 克隆控件 - C# (Winform) [重复]

    这个问题在这里已经有答案了 可能的重复 是否可以复制某个控件的所有属性 C 窗口窗体 我必须创建一些类似于设计时创建的控件的控件 创建的控件应该具有与预定义控件相同的属性 或者换句话说 我想复制一个控件 有没有一行代码可以达到这个目的 或者
  • 快速屏蔽圆段

    I m creating a simple player app There is a circle that shows a progress of playing a song 在 Swift 中绘制这个圆圈并制作蒙版的最佳方法是什么
  • 获取当前类的typedef

    我目前正在将 boost intrusive ptr 与我的 GUI 类一起使用 虽然这或多或少是一个方便的问题 但是否有正确的方法来获取当前类的类型名 我问的原因是我有一个用于定义不同指针类型的宏 define INTRUSIVE PTR
  • Python - 从 Selenium 中 ::before 伪元素上的 CSS 属性“content”获取文本?

    我正在尝试抓取一些元素并返回网页上显示的文本 我相信我可以通过 css selectors 和 xpaths 很好地找到元素 但我无法返回所需的文本 下面是我的程序 from selenium import webdriver from s