使用Python和Selenium抓取博彩公司赔率数据的代码问题求助
使用Python和Selenium抓取博彩公司赔率数据的代码问题求助
看起来你在抓取博彩赔率数据时遇到了元素定位和数据结构的问题,我来帮你梳理下问题所在,然后给出可行的解决方案~
首先说下你代码里的核心错误:body.find_elements()返回的是WebElement对象的列表,所以body_raws最终是一个「列表的列表」(每个元素对应某一个table body下的所有行元素)。如果你直接循环body_raws里的元素,拿到的是一整组行元素的列表,而不是单个WebElement,自然会报错「列表没有text属性」。
要得到你想要的三层列表结构,我们可以分层次遍历元素,一步步解析数据:
修正后的代码示例
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 替换成你的目标网页URL driver.get("目标网页地址") # 存储最终的三层列表数据 final_data = [] # 获取所有表格主体(每个主体对应一个盘口的所有博彩公司数据) tables_bodies = driver.find_elements(By.CSS_SELECTOR, "div.ui-table__body") for body in tables_bodies: # 当前盘口下的所有博彩公司数据列表 current_handicap_group = [] # 获取当前主体下的每一行(每行对应一个博彩公司的赔率) bookmaker_rows = body.find_elements(By.CSS_SELECTOR, "div.ui-table__row") for row in bookmaker_rows: # 方式1:直接拆分整行文本(需根据页面实际文本格式调整) row_content = row.text.strip().split() # 假设行文本格式为「Bet365 2.5 - -」,对应你需要的结构 if len(row_content) >= 4: bookmaker = row_content[0] handicap = row_content[1] odd1 = row_content[2] odd2 = row_content[3] current_handicap_group.append([bookmaker, handicap, odd1, odd2]) # 方式2(更可靠):定位每个子元素单独取文本(推荐) # 如果页面每行的各字段都在独立子元素里,比如: # bookmaker = row.find_element(By.CSS_SELECTOR, "div.ui-table__cell--bookmaker").text # handicap = row.find_element(By.CSS_SELECTOR, "div.ui-table__cell--handicap").text # odd1 = row.find_element(By.CSS_SELECTOR, "div.ui-table__cell--odd1").text # odd2 = row.find_element(By.CSS_SELECTOR, "div.ui-table__cell--odd2").text # current_handicap_group.append([bookmaker, handicap, odd1, odd2]) # 确保当前盘口有数据再加入最终列表 if current_handicap_group: final_data.append(current_handicap_group) # 打印结果验证 for group in final_data: print(group) driver.quit()
额外建议:优化数据存储结构
你提到可能有更好的信息存储方式,其实用字典列表会比纯三层列表可读性更强,后续处理数据也更方便,比如:
current_handicap_group.append({ "bookmaker": bookmaker, "handicap": handicap, "odd1": odd1, "odd2": odd2 })
备注:内容来源于stack exchange,提问作者Gabrielek
相关产品推荐
相关产品推荐

