我正在尝试抓取一些元素并返回网页上显示的文本。 我相信我可以通过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
实际上是由一个名为content
的CSS
属性呈现的,该属性只能与伪元素:before
和:after
一起使用。如果您有兴趣,可以在此处阅读它的工作原理。
文本呈现为图标;有时由组织完成此操作,以避免抓取合理的值。但是,有一种方法(有点困难(可以解决这个问题。使用Selenium
和javascript
,您可以单独定位属性content
的CSS
值,其中属性包含您所追求的值。
研究了一个小时后,这是获得您想要的值的最简单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
来选择值。您可以在此处查看更多信息