1

私はPythonとSeleniumを扱う完全な初心者で、1週間前に始めたばかりなので、コードの混乱を許してください。この Web サイトのタグ名を持つ要素からすべての 'structure_id' および 'd' 情報を抽出し、それぞれを個別の svg ファイルに保存しようとしています。これは私が問題を抱えているコードのスニペットです:

for number in range(1,106):
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.ID, 'master_group'))
        )
        selected = driver.find_element_by_class_name('simstripImgSel')

        driver.get(driver.current_url)
        paths = driver.find_elements_by_tag_name('path')
        
        for path in paths:
            while True:
                try:
                    structure = path.get_attribute('structure_id')
                    d = path.get_attribute('d')
                    break
                except Exception as e:
                    print(e)
                    paths = driver.find_elements_by_tag_name('path')
                    continue
            if structure != None:
                print('Attributes copied.')
                for word, initial in data.items():
                    structure = structure.replace(word,initial)
                filepath = Path('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg')
                if filepath.is_file():
                    text = open('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg','r+')
                    rep = text.read()
                    rep = rep.replace('</svg>','<path id="')
                    text.close()
                    os.remove('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg')
                    time.sleep(0.2)
                    text = open('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg','w+')
                    text.write(rep+str(structure)+'" d="'+str(d)+'"></path></svg>')
                    text.close()
                    print('File '+str(structure)+' modified in slice '+str(number)+'!')
                else:
                    svg = open('C:\\Users\\justs\\Downloads\\Ordered_svgs\\slice'+str(number)+'\\'+str(structure)+'.svg','w+')
                    svg.write('<svg id="the_svg_wrapper" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"><path id="'+str(structure)+'" d="'+str(d)+'"></path></svg>')
                    svg.close()
                    print('File '+str(structure)+' made in slice '+str(number)+'!')

        selected.send_keys('F')
        paths = 0
        print()
        
    except Exception as e:
        print('Error.')
        print(e)
        break

print('Done!')
driver.quit()

これは最初のページでは問題なく機能しますが、106 ページすべてのパスを抽出する必要があり、'F' を 1 回押した後 (次のページに移動します)、行で古い要素参照を取得しますstructure = path.get_attribute('structure_id')。最初は、パスの読み込みに時間がかかったため、while ループが発生したと思っていましたが、2 ページ目までに、終わりのない古い要素の参照でスタックします。

明示的な待機またはページの更新も機能しませんでしたdriver.find_element_by_class_name。WebElement がまったく更新されていないと思われます (次のページに移動した後にページを更新すると、抽出したファイルは最初のページと同じになりました。とにかく5ページで古い要素の参照を取得しました)。これを解決するにはどうすればよいですか?どんな助けでも大歓迎です!

4

1 に答える 1

1

URL をループしたため、ページ 1 に移動しました。

driver.get('http://atlas.brain-map.org/atlas?atlas=265297126#atlas=265297126&plate=102339919&structure=10155&x=42480&y=16378&zoom=-7&resolution=124.49&z=2')
for i in range(1,106):
    try:
        paths=WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.TAG_NAME, "path")))   
        for path in paths:
            structure = path.get_attribute('structure_id')
            d = path.get_attribute('d')
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "simstripImgSel"))).send_keys("F")
        time.sleep(0.5)
    except Exception as e:
        print(e)

輸入

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
于 2020-10-12T04:00:20.647 に答える