使用selenenium WebDriver获取文本数据的问题

问题描述 投票:0回答:2

我已成功导航到一个网站页面,该页面有多个指向更多页面的链接。在我的代码中,我计算链接的数量,然后将其转换为 xpath,这样我就可以输入所有页面。一切都很好,直到我尝试从这些页面中获取任何内容。它们都具有精确的外形尺寸,因此我应该能够在页面内使用相同的 xpath。 ** 这是失败的代码部分:**

xpath_expression = '//*[@id="wrapper"]/main/section/div/div[2]/table/tbody'
element = browser.find_element("xpath", xpath_expression)
html_code = element.get_attribute("outerHTML")
number_of_pages_to_enter= html_code.count("<tr")
number_of_pages_to_enter=number_of_pages_to_enter-2
xpatht_eleje='//*[@id="wrapper"]/main/section/div/div[2]/table/tbody/tr['


cimek=''
for i in range(number_of_pages_to_enter):
    number_of_pages_to_enter_str=str(number_of_pages_to_enter)
    number_of_pages_to_enter_str=number_of_pages_to_enter_str+"]/td[3]/a"
    xpath_expression=xpatht_eleje+number_of_pages_to_enter_str
    button_locator = ("xpath", xpath_expression)
    button = WebDriverWait(browser, 5).until(
        EC.presence_of_element_located(button_locator)
    )
    button.click()
    time.sleep(0.5)
    element = browser.find_element(By.XPATH, '//*[@id="eventHeader"]/div[2]/div/h1')
    cim=element.text
    cimek=cim+cim
    if number_of_pages_to_enter>0:
        number_of_pages_to_enter=number_of_pages_to_enter-1
    browser.back()

这是我正在测试代码的页面的链接:text 名为 cimek 的字符串是我尝试收集数据的地方。

我已经尝试过使用其他定位器,然后是 xpath,但都不起作用。我得到的结果只是一个元素。

python selenium-webdriver web-scraping selenium-chromedriver
2个回答
0
投票

问题的根源在于您正在使用

循环遍历所有行
for i in range(number_of_pages_to_enter):

但是您没有使用

i
,您正在使用
number_of_pages_to_enter


话虽如此,当有更简单的方法时,您会花费大量时间/代码解析、计算、构建字符串等来循环遍历表。您只需为所需的元素构建一个定位器,使用

find_elements(locator)
,然后循环遍历该组元素即可。

此外,您还可以单击链接进入下一页以了解谁正在玩游戏,例如“克利夫兰 - 达拉斯”,但该信息已经在第一页上。

Kosárlabda, NBA
Cleveland - Dallas <<<
02.27. 18:00

我修改了您的代码,让您无需单击任何内容、离开页面并返回等即可获得此信息。

url = 'https://www.tippmix.hu/sportfogadas#?q=nba&page=1'
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

wait = WebDriverWait(driver, 10)
games = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//tbody/tr/td[3][@class='title']/a")))
for game in games:
    print(game.text.split("\n")[1])

输出

Cleveland - Dallas
Washington - Golden State
Orlando - Brooklyn       
New York - New Orleans   
Atlanta - Utah
Boston - Philadelphia
Milwaukee - Charlotte
Chicago - Detroit    
Minnesota - San Antonio
Oklahoma City - Houston
Portland - Miami
Hard - Bärnbach/Köflach
NBA 2023/24

0
投票

当有可以从中获取数据的公共 API 时,不要使用 Selenium。不确定您到底想要什么,但我将 json 返回转储到表中以显示您在此请求中得到的内容:

import requests

url = 'https://api.tippmix.hu/tippmix/search'
payload = {
    "fieldValue":"nba",
    "sportId":0,
    "competitionGroupId":0,
    "competitionId":0,
    "competitionType":"",
    "type":0,
    "date":"0001-01-01T00:00:00.000Z",
    "hitsPerPage":9999,
    "page":1,
    "minOdds":"",
    "maxOdds":""}

jsonData = requests.post(url, json=payload).json()

输出:

import pandas as pd
df = pd.json_normalize(jsonData,
                       record_path =['data','events'])

表格:(此处仅显示前 3 行)

print(df.head(3).to_string())
   eventId                 eventName matchStatus                  eventDate  eventVersion  bettingStatus  betradarId  sportId   sportName  competitionId competitionName  competitionGroupId competitionGroupName                                          competitions  isLive  isOutright  bettingPhase  hasVisiblePrematchMarket  remainingPrematchMarketCount  hasVisibleLiveMarket  remainingLiveMarketCount                                                                                                       eventParticipants                                                              competitionClosedCombinations eventClosedCombinations  liveStreamAvailable liveStreamEventId  liveStreamProviderId webNote  competitionGroupRefId  competitionRefId                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    markets
0  3355538  Philadelphia - Charlotte              2024-03-02T01:00:00+01:00    1006964418              0    43066949        2  Kosárlabda           1296             NBA                 199                  USA  [{'type': 'competition', 'id': 1296, 'name': 'NBA'}]       0           0             0                      True                            68                 False                         0  [{'participantName': 'Philadelphia', 'participantId': 11869}, {'participantName': 'Charlotte', 'participantId': 2914}]  [{'cCGroupIds': [1], 'competitionId': 1299}, {'cCGroupIds': [1], 'competitionId': 42617}]                    None                False                                       0                             15               177  [{'marketId': 72774773, 'marketName': 'A mérkőzés győztese', 'marketType': 1, 'marketStatus': 1, 'channelWeb': 1, 'channelRetailer': 1, 'marketVersion': 1006954130, 'marketSubType': 2, 'minCombiCount': 1, 'minCombiCountLrt': 1, 'maxCombiCount': 2147483647, 'marketTypePriority': 2, 'marketTypeCCGroups': [1], 'mainMarket': 1, 'specialOddsValue': '', 'winnerOutcomeName': '', 'marketClosedCombinations': [], 'roundId': 0, 'outcomes': [{'outcomeNo': 1, 'outcomeName': 'Philadelphia', 'fixedOdds': 1.15, 'outcomeResult': 1, 'outcomeRealNo': '01'}, {'outcomeNo': 2, 'outcomeName': 'Charlotte', 'fixedOdds': 4.8, 'outcomeResult': 1, 'outcomeRealNo': '02'}], 'outcomeCount': 2, 'marketRealNo': '04525'}]
1  3355540       Detroit - Cleveland              2024-03-02T01:00:00+01:00    1006954126              0    43066947        2  Kosárlabda           1296             NBA                 199                  USA  [{'type': 'competition', 'id': 1296, 'name': 'NBA'}]       0           0             0                      True                            50                 False                         0        [{'participantName': 'Detroit', 'participantId': 3876}, {'participantName': 'Cleveland', 'participantId': 3113}]  [{'cCGroupIds': [1], 'competitionId': 1299}, {'cCGroupIds': [1], 'competitionId': 42617}]                    None                False                                       0                             15               177       [{'marketId': 72773000, 'marketName': 'A mérkőzés győztese', 'marketType': 1, 'marketStatus': 1, 'channelWeb': 1, 'channelRetailer': 1, 'marketVersion': 1006953998, 'marketSubType': 2, 'minCombiCount': 1, 'minCombiCountLrt': 1, 'maxCombiCount': 2147483647, 'marketTypePriority': 2, 'marketTypeCCGroups': [1], 'mainMarket': 1, 'specialOddsValue': '', 'winnerOutcomeName': '', 'marketClosedCombinations': [], 'roundId': 0, 'outcomes': [{'outcomeNo': 1, 'outcomeName': 'Detroit', 'fixedOdds': 3.9, 'outcomeResult': 1, 'outcomeRealNo': '01'}, {'outcomeNo': 2, 'outcomeName': 'Cleveland', 'fixedOdds': 1.22, 'outcomeResult': 1, 'outcomeRealNo': '02'}], 'outcomeCount': 2, 'marketRealNo': '04455'}]
2  3355482           Boston - Dallas              2024-03-02T01:30:00+01:00    1006954348              0    43066951        2  Kosárlabda           1296             NBA                 199                  USA  [{'type': 'competition', 'id': 1296, 'name': 'NBA'}]       0           0             0                      True                            57                 False                         0            [{'participantName': 'Boston', 'participantId': 2068}, {'participantName': 'Dallas', 'participantId': 3673}]  [{'cCGroupIds': [1], 'competitionId': 1299}, {'cCGroupIds': [1], 'competitionId': 42617}]                    None                False                                       0                             15               177          [{'marketId': 72773619, 'marketName': 'A mérkőzés győztese', 'marketType': 1, 'marketStatus': 1, 'channelWeb': 1, 'channelRetailer': 1, 'marketVersion': 1006954215, 'marketSubType': 2, 'minCombiCount': 1, 'minCombiCountLrt': 1, 'maxCombiCount': 2147483647, 'marketTypePriority': 2, 'marketTypeCCGroups': [1], 'mainMarket': 1, 'specialOddsValue': '', 'winnerOutcomeName': '', 'marketClosedCombinations': [], 'roundId': 0, 'outcomes': [{'outcomeNo': 1, 'outcomeName': 'Boston', 'fixedOdds': 1.22, 'outcomeResult': 1, 'outcomeRealNo': '01'}, {'outcomeNo': 2, 'outcomeName': 'Dallas', 'fixedOdds': 3.85, 'outcomeResult': 1, 'outcomeRealNo': '02'}], 'outcomeCount': 2, 'marketRealNo': '04572'}]
© www.soinside.com 2019 - 2024. All rights reserved.