对于一个小项目,我需要从以下网站提取破产公告:https://neu.insolvenzbekanntmacungen.de/ap/suche.jsf 输入今天的日期并从“Gegenstand der Veröffentlichung”的下拉菜单中选择“Eröffnungen”并单击底部的“搜索”后,我需要的是随后隐藏在页面缩放图标后面的文本。
我用来实现这个的Python代码如下:
import...
driver = webdriver.Safari()
driver.maximize_window()
driver.get("https://neu.insolvenzbekanntmachungen.de/ap/suche.jsf")
date_input = WebDriverWait(driver, 10).until(
ec.visibility_of_element_located((By.ID, "frm_suche:ldi_datumVon:datumHtml5"))
)
curr_date = datetime.today().strftime("%Y-%m-%d")
arg_value = f"arguments[0].value = '{curr_date}';"
driver.execute_script("arguments[0].value = '';", date_input)
driver.execute_script(arg_value, date_input)
# Select the "Eröffnungen" option from the dropdown menu
select_element = WebDriverWait(driver, 20).until(
ec.visibility_of_element_located((By.ID, "frm_suche:lsom_gegenstand:lsom"))
)
driver.execute_script("arguments[0].scrollIntoView(true);", select_element)
time.sleep(1)
select = Select(select_element)
select.select_by_value("2")
# Execute the search
driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", date_input)
date_input.send_keys(Keys.RETURN)
results_table = WebDriverWait(driver, 20).until(
ec.visibility_of_element_located((By.ID, "tbl_ergebnis"))
)
rows = results_table.find_elements(By.TAG_NAME, "tr")
data = []
# Iterate over each row of the table
for i, row in enumerate(rows):
cells = row.find_elements(By.TAG_NAME, "td")
if len(cells) > 0:
# Click the zoom icon to open the new window
zoom_icon = cells[6].find_element(By.TAG_NAME, "input[type='image']")
WebDriverWait(driver, 20).until(
ec.element_to_be_clickable((By.TAG_NAME, "input[type='image']"))
)
driver.execute_script("arguments[0].scrollIntoView(true);", zoom_icon)
time.sleep(1) # Wait for scroll
driver.execute_script("arguments[0].click();", zoom_icon)
# Wait for the new window to open
WebDriverWait(driver, 20).until(ec.new_window_is_opened)
driver.switch_to.window(driver.window_handles[1])
# Extract the publication text
print("here")
WebDriverWait(driver, 20).until(
ec.presence_of_element_located((By.XPATH,
"//form[@id='form']//pre[@id='veroefftext']"))
)
print("here2")
pub_text = driver.find_element(By.XPATH, "//form[@id='form']//pre[@id='veroefftext']").text
# Close the new window and switch to the first window again
driver.close()
driver.switch_to.window(driver.window_handles[0])
# Store the extracted data
data.append({
'veroeffentlichungsdatum': cells[0].text,
'aktenzeichen': cells[1].text,
'gericht': cells[2].text,
'name_vorname_bezeichnung': cells[3].text,
'sitz_wohnsitz': cells[4].text,
'register': cells[5].text,
'veroeffentlichungstext': pub_text
})
df = pd.DataFrame(data)
df.columns = ['veroeffentlichungsdatum', 'aktuelles_aktenzeichen', 'gericht',
'name_vorname_bezeichnung', 'sitz_wohnsitz', 'register', 'veroeffentlichungstext']
df.to_excel("data/insos.xlsx", index=False)
我对 Selnium 比较陌生,但我认为代码本身运行良好并且能够完成预期的任务。但是,对于两个打印语句之间的部分(print(here)、print(here2)),元素无法本地化的情况不断发生,并且我收到 TimeoutException。这似乎是随机发生的,因为有时有效,有时无效。我还已经进行了一次运行,能够完全提取所有缩放图标后面的文本。
难道标识符不唯一?我已经读过相关的帖子,大多数时候它建议使用我已经实现的 XPATH。我已经在相关帖子中建议的 print(here) 语句之后尝试了 driver.switch_to.default_content() 但仍然存在同样的问题。
非常感谢任何帮助我如何使其稳定,因为脚本应该每天执行。谢谢:)
您明确等待它被定位,您自己说过有时它有效,有时它不起作用。你等待 20(毫秒或秒,我不知道)
根据您的描述,有时它的定位速度足够快,有时则不然。这意味着当元素有足够的时间来定位自身时,您必须调整等待参数并找到最佳解决方案。