Holen Sie sich eine Seite mit Selenium, aber warten Sie, bis der unbekannte Elementwert nicht leer ist
Kontext
Dies ist ein Repost von Get a page with Selenium, aber warten Sie, bis der Elementwert nicht leer ist , der, soweit ich das beurteilen kann, ohne Gültigkeit geschlossen wurde.
Die verknüpften Antworten in der Abschlussbegründung hängen beide davon ab, dass der erwartete Textwert bekannt ist. In jeder Antwort wird explizit der erwartete Text angezeigt, der im WebDriverWait
Anruf fest codiert ist . Darüber hinaus berührt keine der verknüpften Antworten den letzten Teil meiner Frage auch nur aus der Ferne:
[ob die erwarteten Bedingungen] kommen vor oder nach der Seite Get
"Doppelte" Fragen
- Wie extrahiere ich Daten aus dem folgenden HTML?
- Geben Sie an, ob der Text in einem Element einen bestimmten Teiltext enthält
Ursprüngliche Frage
Ich greife mit Selenium zu einer Webseite, muss aber warten, bis ein bestimmter Wert geladen ist. Ich weiß nicht, was der Wert sein wird, nur in welchem Element er vorhanden sein wird.
Es scheint, dass die Verwendung der erwarteten Bedingung text_to_be_present_in_element_value
oder text_to_be_present_in_element
der wahrscheinlichste Weg in die Zukunft ist, aber ich habe Schwierigkeiten, eine tatsächliche Dokumentation zur Verwendung dieser zu finden, und ich weiß nicht, ob sie vor oder nach der Seite Get:
webdriver.get(url)
Umformulieren
Wie erhalte ich eine Seite mit Selenium, warte aber, bis ein unbekannter Textwert den Text oder Wert eines Elements auffüllt, bevor ich fortfahre?
Antworten
Ich bin mir sicher, dass meine Antwort nicht die beste ist, aber hier ist ein Teil meines eigenen Codes, der mir bei ähnlichen Fragen geholfen hat.
In meinem Fall hatte ich Probleme mit der Ladezeit des DOM. Manchmal dauerte es 5 Sekunden, manchmal 1 Sekunde und so weiter.
url = 'www.somesite.com'
browser.get(url)
Weil in meinem Fall browser.implicitly_wait(7)
nicht genug war. Ich habe es einfach gemacht for loop
zu überprüfen, ob der Inhalt geladen ist.
some code...
for try_html in range(7):
""" Make 7 tries to check if the element is loaded """
browser.implicitly_wait(7)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
raw_data = soup.find_all('script', type='application/ld+json')
"""if SKU in not found in the html page we skip
for another loop, else we break the
tryes and scrape the page"""
if 'sku' not in html:
continue
else:
scrape(raw_data)
break
Es ist nicht perfekt, aber Sie können es versuchen.