【问题标题】:Convert output from Selenium in Python在 Python 中转换 Selenium 的输出
【发布时间】:2021-08-08 23:42:16
【问题描述】:

我有这个代码:

from selenium import webdriver

# Set url and path
url = 'https://osu.ppy.sh/beatmapsets?m=0'
driver = webdriver.Chrome(executable_path=r"C:\Users\Gabri\anaconda3\chromedriver.exe")
driver.get(url)

# Select the item that i want
try:
    dif = driver.find_element_by_css_selector('div.beatmapset-panel__beatmap-dot')
    dif.text
    print(dif)
except:
    print('not found')

我正在尝试选择此地图难度“紫色专家”--> https://imgur.com/a/G224rka 但我无法继续使用我的代码,因为输出是 "<selenium.webdriver.remote.webelement.WebElement (session="3cdaf38d0673d0aebe49733d629eae5c", element="60d6241b-80f7-42c8-bf38-9fd2c8574b08")>",我预计这将是一个类似于“专家”的字符串" 或 "--bg:var(--diff-expert);"我如何翻译或转换?我确实尝试使用'[class*="beatmapset-panel__beatmap-dot"' 进行选择,并且输出是相同的。有人可以帮助我吗?

【问题讨论】:

  • print(dif.text) 也许?
  • @JustinEzequiel 输出什么都没有 imgur.com/a/h7Sa1JH =((
  • 检查我的答案
  • 这就是我想说的,这正是我想要做的,谢谢兄弟=DDDD。你现在可以把它交给我,我会从这里拿走哈哈,但我很感激让你教我

标签: python html css selenium selenium-webdriver


【解决方案1】:

您需要将代码更改如下以打印元素文本:

from selenium import webdriver

# Set url and path
url = 'https://osu.ppy.sh/beatmapsets?m=0'
driver = webdriver.Chrome(executable_path=r"C:\Users\Gabri\anaconda3\chromedriver.exe")
driver.get(url)

# Select the item that i want
try:
    dif = driver.find_element_by_css_selector('div.beatmapset-panel__beatmap-dot')    
    print(dif.text)
except:
    print('not found')

【讨论】:

  • 当然,您必须添加一些等待或延迟才能使页面加载,然后才应用 dif = driver.find_element_by_css_selector('div.beatmapset-panel__beatmap-dot') 否则该元素仍然不存在或刚刚出现但仍未完全呈现!
  • @JD2775 你是对的!也许他正在寻找其他元素?我看到 div.beatmapset-panel__beatmap-dot 那里有 67 个元素
  • 几乎工作了,但我仍然有一个不可读的输出imgur.com/a/h2m8w7F,还有其他想法吗?哈哈
  • @Prophet 抱歉,我删除了我的回复,没有意识到你会回复 :) 我添加了一个新答案
  • @Prophet 我刚刚重新阅读了 OP。他正在寻找紫色的酒吧。它看起来像一个悬停动作,然后切换到它并以某种方式获取文本。它比我最初想的要复杂。删除了我的答案
【解决方案2】:

您需要将鼠标悬停在一个元素上,然后等待数据出现并获取其文本:

这是列表中第一场比赛的 sn-p。要获得所有游戏,您需要另一个循环。

我正在使用ActionChains 将鼠标悬停在元素上。即使对我来说,为这个网站寻找定位器也不是一件容易的事。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains


driver = webdriver.Chrome(executable_path='/snap/bin/chromium.chromedriver')
driver.get("https://osu.ppy.sh/beatmapsets?m=0")
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".beatmapsets__items-row:nth-of-type(1)>.beatmapsets__item:nth-of-type(1)")))
games = driver.find_element_by_css_selector(".beatmapsets__items-row:nth-of-type(1) .beatmapsets__item:nth-of-type(1) .beatmapset-panel__info-row--extra")
actions = ActionChains(driver)
actions.move_to_element(games).perform()
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".beatmaps-popup__group")))
levels = driver.find_elements_by_css_selector(".beatmaps-popup__group .beatmaps-popup-item__col.beatmaps-popup-item__col--name.u-ellipsis-overflow")
for level in levels:
    print(level.text)

输出:

Hinsvar's Hard
Zelqurre's Insane
Amamir's Shining Stars

对于通过级别列表的迭代,请使用此 css 选择器:

.beatmapsets__items-row:nth-of-type(1) .beatmapsets__item:nth-of-type(1) .beatmapset-panel__info-row--extra

并迭代这个定位器:

.beatmapsets__items-row:nth-of-type(1) .beatmapsets__item:nth-of-type(1) .beatmapset-panel__info-row--extra,

.beatmapsets__items-row:nth-of-type(2) .beatmapsets__item:nth-of-type(1) .beatmapset-panel__info-row--extra

更新: 要获得分数,请使用:

scores= driver.find_elements_by_css_selector(".beatmaps-popup__group .beatmaps-popup-item__col.beatmaps-popup-item__col--difficulty")
for score in scores:
    print(score.text)

输出将是:

2.58
3.46
4.55
4.90
5.97

另外,请查看有关如何将结果放在一个列表中的答案:Trouble retrieving elements and looping pages using next page button

最后在这里阅读有关 CSS 选择器的信息:https://www.w3schools.com/cssref/css_selectors.asp

我通常更喜欢使用它们,因为它们更短。

【讨论】:

  • 我非常感谢兄弟,它成功了!我也做了一个循环来一张一张地显示地图,但我只有一个问题=(我不能在旁边显示数字,因为仅描述您的代码打印不足以正确过滤所有地图,我需要显示这些数字--> imgur.com/a/FOJs74a你能再帮我一次吗?=,)
  • 顺便说一句,你不知道你的回答对我有多大帮助,我从你的代码中学到了很多^-^
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2016-02-23
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多