我正在尝试制作一个网页元素列表,但它似乎无法在网页上找到这些元素,虽然3天前确实工作过,我在网页上找不到任何更改。
这是html代码:
<li id="wlg_41410" class="leagueWindow " dataid="41410">
<h5 style="cursor: pointer; cursor: hand;" onclick="TodaysEventsLeagueWindow.minimizeRestoreClick(41410)">Europa League</h5>
<div class="bet_type select" id="_bet_types"></div>
<div class="bet_type lastscore ">
<h6>1X2 FT </h6>
<div class="types_bg">
<!--[if IE]> <div id="IEroot"> <![endif]-->
<div class="first_buttons_line">
</div>
<!--[if IE]> </div> <![endif]-->
<div class="time"> 23/11 | 18:00 </div>
<div class="bets ml">
</div>
<div class="time"> 23/11 | 20:00 </div>
<div class="bets ml">
</div>
<div class="time"> 23/11 | 20:00 </div>
<div class="bets ml">
</div>
<div class="time"> 23/11 | 20:00 </div>
<div class="bets ml">
</div>
<div class="time"> 23/11 | 20:00 </div>
<div class="bets ml">
</div>
<div class="clr"></div>
</div>
</div> <span class="x" onclick="TodaysEventsLeagueWindow.closeLeagueWindow(41410)"></span>
</li>
&#13;
我正在尝试从<div class="bets ml"></div>
元素中创建一个列表
但不断获得selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
例外,好像硒无法找到网络元素。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException
import time
driver.get("https://www.luckia.es/apuestas")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("sbtechBC"))
eventos_de_hoy = driver.find_element_by_id("today_event_btn")
eventos_de_hoy.click()
ligi_len = len(WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "leagueWindow "))))
print(ligi_len)
for index in range(ligi_len):
item = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "leagueWindow ")))[index]
driver.execute_script("arguments[0].scrollIntoView(true);", item)
nume_liga = item.find_element_by_tag_name("h5").text
time.sleep(3)
print('try', nume_liga)
meci = item.find_elements_by_xpath("//*[@class='bets ml']")
print("there are", len(meci), "in one liga")
index
的原因是iframe每25秒刷新一次。
我还尝试了meci = item.find_elements_by_css_selector('.bets.ml')
和meci = item.find_elements_by_class_name('ml')
为什么我能够提取<h5></h5>
元素而不是其他元素?
答案 0 :(得分:0)
从你的代码块中,很明显你已经设法通过time.sleep(3)
掩盖了真正的问题,如下所示:
nume_liga = item.find_element_by_tag_name("h5").text
time.sleep(3)
print('try', nume_liga)
在为文本调用print()
时,我不确定为什么time.sleep(3)
被诱导。所以我们的主要问题在那里被掩盖了。但是,由于List
已经创建,您可以print('try', nume_liga)
但接下来,当您执行meci = item.find_elements_by_xpath("//*[@class='bets ml']")
时,您会遇到 StaleElementReferenceException
,因为 HTML DOM
已更改。
仔细查看<h5>
标记会发现它有onclick()
个事件:
<h5 style="cursor: pointer; cursor: hand;" onclick="TodaysEventsLeagueWindow.minimizeRestoreClick(41410)">Europa League</h5>
一个疯狂的猜测,在.text
标记上调用<h5>
时, HTML DOM
会发生变化。
使用当前代码块的可能解决方案可能是使用 getAttribute("innerHTML")
而不是.text
。所以你的代码行将是:
nume_liga = item.find_element_by_tag_name("h5").get_attribute("innerHTML")