【问题标题】:How can I get selenium to interact with fivethirtyeight search bars?我怎样才能让 selenium 与 Fivethirtyeight 搜索栏进行交互?
【发布时间】:2022-01-20 15:24:01
【问题描述】:

我正在使用这个网站 (https://projects.fivethirtyeight.com/2020-nba-player-projections/) 并尝试自动搜索玩家。我有一个玩家列表,但似乎无法连接到正确的元素。我尝试过 xpath、id 和 css_selector。下面是一个示例代码:

driver.get('https://projects.fivethirtyeight.com/2020-nba-player-projections/')
search_bar = driver.find_element_by_id('player-selectbox')
search_bar.click() 
search_bar.send_keys('lebron james')
search_bar.send_keys(Keys.RETURN)

无论我尝试哪种方式,我都会收到以下错误:

Message: element not interactable

下面是我正在尝试访问的框的屏幕截图的链接。

screenshot

谢谢!

【问题讨论】:

  • 您能告诉我们您正在尝试与哪个元素进行交互吗?添加带有搜索栏指示器的屏幕截图会很有用

标签: python selenium search


【解决方案1】:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time


driver.get("https://projects.fivethirtyeight.com/2020-nba-player- projections/")
    
driver.find_element_by_xpath("//input[@placeholder='player name']").click()
    
driver.find_element_by_xpath("//input[@placeholder='player name']").send_keys('Kyrie Irving')

driver.find_element_by_xpath("//input[@placeholder='player name']").send_keys(Keys.ARROW_RIGHT)
time.sleep(10)
driver.close()

这段代码完美运行,复杂之处在于它是一个自动填充类型的搜索栏,我找到了一个简单的解决方法,使用 Keys.ARROW_RIGHT 来处理它

下面附上截图,

【讨论】:

    【解决方案2】:

    这应该可以工作

    search_bar = driver.find_element_by_xpath("//input[@placeholder='player name']")
    search_bar.click()
    search_bar.send_keys('lebron james')
    time.sleep(2)
    driver.find_element_by_xpath("//*[@class='tt-suggestion tt-selectable']").click()
    

    请随意将time.sleep 替换为explicit wait

    【讨论】:

    • 谢谢@Anand 这在大多数情况下都有效,我会随机捕获少数例外情况
    • 我试过了,还是不行
    【解决方案3】:

    为什么不直接从 json 中获取数据呢?会比 Selenium 高效得多。

    import requests
    import re
    import json
    import pandas as pd
    from fuzzywuzzy import process
    
    # Get Player Slugs from javascript
    response = requests.get('https://projects.fivethirtyeight.com/2020-nba-player-projections/js/bundle.js')
    
    js = response.text
    p = re.compile('{t\.exports=(\[.*}]},{}\])')
    result = p.search(js).group(1).rsplit('},{}',1)[0]
    
    result = result.replace('team_abbr', '"team_abbr"')
    result = result.replace('name', '"name"')
    result = result.replace('full_team', '"full_team"')
    result = result.replace('short_team', '"short_team"')
    result = result.replace('slug', '"slug"')
    result = result.replace(',randable:!1', '')
    result = result.replace(',randable:!0', '')
    
    playerSearch = json.loads(result)
    df = pd.DataFrame(playerSearch)
    
    players = list(df['name'])
    slugs = list(df['slug'])
    
    playerDict = dict(zip(players, slugs))
    
    
    
    # Get the Player Data
    # You could also make this as a user input
    
    list_of_players = ['lebron james', 'Derik RoSe', 'LEamarkcus Allridge']
    
    data = {}
    for player in list_of_players:
        playerMatch = process.extractOne(player, list(playerDict.keys()))[0]
        player_slug = playerDict[playerMatch]
    
        url = f'https://projects.fivethirtyeight.com/2020-nba-player-projections/{player_slug}.json'
        jsonData = requests.get(url).json()
        
        data[playerMatch] = jsonData
        print(f'Returned: {playerMatch}')
    

    输出:

    【讨论】:

    • Megalina 没有指定使用 Python 请求。 Megalina 希望用 Python Selenium 来完成
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2021-12-19
    • 2021-05-27
    • 2011-05-03
    相关资源
    最近更新 更多