Selenium не обновляет сайт (Python) - PullRequest
0 голосов
/ 26 апреля 2018

В проекте, который я делаю, я говорю Selenium пойти и почистить данные на следующей странице, которая имеет точно такой же URL.

Мой код:

driver = webdriver.Chrome()
driver.get("https://etherscan.io/token/0x168296bb09e24a88805cb9c33356536b980d3fc5#balances")

iframe1 = driver.find_element_by_id('tokeholdersiframe')
driver.switch_to.frame(iframe1)
soup = BeautifulSoup(driver.page_source, 'html.parser')
token_holders = soup.find_all('tr')

driver.find_element_by_link_text('Next').click()
time.sleep(10)
token_holders2 = soup.find_all('tr') #I get the data from previous page (exact same as token_holder) rather than the new data.

Тем не менее, Selenium не обновляется, и я все еще получаю те же данные с предыдущей страницы.

Я пытался использовать неявное ожидание после клика:

driver.implicitly_wait(30)

, но оно не работает,Я также попытался сбросить суп на driver.page_source, а также заставить водителя перефразировать iframe с помощью driver.find_element_by_id("id"), но ни одна из них не работает.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

После создания soup он не будет динамически обновляться, чтобы отображать driver.page_source.Вам необходимо создать новый экземпляр BeautifulSoup и передать обновленный источник страницы.

token_holders = soup.find_all('tr')

driver.find_element_by_link_text('Next').click()
soup = BeautifulSoup(driver.page_source, 'html.parser')
token_holders2 = soup.find_all('tr')
>>> token_holders[1:]
[<tr><td>1</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0xd35a2d8c651f3eba4f0a044db961b5b0ccf68a2d" target="_parent">0xd35a2d8c651f3eba4f0a044db961b5b0ccf68a2d</a></span></td><td>310847219.011683</td><td>31.0847%</td></tr>,
 <tr><td>2</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0xe17c20292b2f1b0ff887dc32a73c259fae25f03b" target="_parent">0xe17c20292b2f1b0ff887dc32a73c259fae25f03b</a></span></td><td>200000001</td><td>20.0000%</td></tr>,
...
]

>>> token_holders2[1:]
[<tr><td>51</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0x5473621d6d5f68561c4d3c6a8e23f705c8db7661" target="_parent">0x5473621d6d5f68561c4d3c6a8e23f705c8db7661</a></span></td><td>687442.69121294</td><td>0.0687%</td></tr>,
 <tr><td>52</td><td><span><a href="/token/0x168296bb09e24a88805cb9c33356536b980d3fc5?a=0xbc14ca2a57ea383a94281cc158f34870be345eb6" target="_parent">0xbc14ca2a57ea383a94281cc158f34870be345eb6</a></span></td><td>619772.39698</td><td>0.0620%</td></tr>,
 ...
]
0 голосов
/ 26 апреля 2018

Исходя из вопроса, я полагаю, что селен не ждет загрузки следующей страницы.Один из способов обеспечить это (хотя и не самый элегантный) - использовать известные элементы на текущей странице, которые, как вы знаете, изменятся, и ждать, пока это изменение произойдет после нажатия.Вы можете использовать неявное ожидание, см. https://selenium -python.readthedocs.io / waits.html для получения подробной информации о том, как вы можете это сделать.

В качестве альтернативы, вы можете добавить явное ожидание посленажмите кнопку.то есть

 from time import sleep
 ...

 driver.click(..);
 sleep(0.5) # Wait for half a second

 # Scrape the page
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...