感谢您抽出一些时间来解决这个问题。
我正在尝试从CAISO website抓取公开出价数据。我遇到了这些问题:
a。该页面不断更新,所以我认为我的代码是 被卡住。
b。 XML对象标签在每个新会话中都会更改。
对于(a),我尝试使用time.sleep并发送ESC键来停止刷新,但是它不起作用。
不过,我不知道如何解决(b)。我通常要做的是使用此Chrome扩展程序,该扩展程序允许我在页面中获取XML元素,然后在代码中使用这些元素来完成我想要的工作。如果它们每次都更改,则此策略不再起作用。
我希望Selenium要做的是:
到目前为止,这是我的代码:
driver = webdriver.Chrome()
driver.get('http://oasis.caiso.com/mrioasis/logon.do')
PublicBids = driver.find_element(By.XPATH, '//*[@id="IMG_111854124"]')
PublicBids.click()
dates = ['04/18/2019']
def BidsScraper(d):
time.sleep(2)
dateField = driver.find_element(By.XPATH,'//*[@id="TB_101685670"]')
dateField.send_keys(d)
DownloadCSV = driver.find_element(By.XPATH, '//*[@id="BTN_101685706"]')
DownloadCSV.click()
欢迎提出任何建议!再次感谢。
编辑:格式化
答案 0 :(得分:0)
一种解决方法是找到相对于某些静态ID所需的元素/按钮,而不是直接转到元素的动态ID。
我不知道确切的XPath,但是例如包裹日期输入的div
的ID为PFC_Public_Bids_date_from
,因此您可以尝试类似
dateField = driver.find_element(By.XPATH,'//*[@id="PFC_Public_Bids_date_from"]//input')
。
类似地,该按钮可能类似于:
DownloadCSV = driver.find_element(By.XPATH, '//*[@id="CsvExportButton"]//button')
答案 1 :(得分:0)
要尝试的几件事是强制刷新停止并仅在使用Selenium找到元素时单击,或者如果仍然无法使用,我通常会尝试将鼠标移至X / Y之类的方法使用宏程序(例如AppRobotic Personal)进行坐标匹配,然后模拟鼠标单击按钮的X / Y坐标。在“尝试/例外”中与此类似:
import win32com.client
x = win32com.client.Dispatch("AppRobotic.API")
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://oasis.caiso.com/mrioasis/logon.do')
PublicBids = driver.find_element(By.XPATH, '//*[@id="IMG_111854124"]')
PublicBids.click()
dates = ['04/18/2019']
def BidsScraper(d):
# wait for loading
x.Wait(2000)
# forcefully stop page reload at this point
driver.execute_script("window.stop();")
try:
dateField = driver.find_element(By.XPATH,'//*[@id="TB_101685670"]')
dateField.send_keys(d)
DownloadCSV = driver.find_element(By.XPATH, '//*[@id="BTN_101685706"]')
#Confirm that button was found
if len(DownloadCSV) > 0
DownloadCSV.click()
except:
dateField = driver.find_element(By.XPATH,'//*[@id="TB_101685670"]')
x.Type(d)
# use UI Item Explorer to find the X,Y coordinates of button
x.MoveCursor(438, 435)
# click on button
x.MouseLeftClick
x.Wait(2000)