Python - 从 Selenium 中的 ::before 伪元素上的 CSS 属性"content&qu



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

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.这些texts实际上是由一个名为contentCSS属性呈现的,该属性只能与伪元素:before:after一起使用。如果您有兴趣,可以在此处阅读它的工作原理。

文本呈现为图标;有时由组织完成此操作,以避免抓取合理的值。但是,有一种方法(有点困难(可以解决这个问题。使用Seleniumjavascript,您可以单独定位属性contentCSS值,其中属性包含您所追求的值。

研究了一个小时后,这是获得您想要的值的最简单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来选择值。您可以在此处查看更多信息

最新更新