Ausgabe
Der Zweck dieses Codes besteht darin, eine Datentabelle aus einigen Links zu kratzen und sie dann in einen Pandas-Datenrahmen umzuwandeln.
Das Problem ist, dass dieser Code nur die ersten 7 Zeilen kratzt, die sich auf der ersten Seite der Tabelle befinden, und ich möchte die gesamte Tabelle erfassen. Als ich also versuchte, Tabellenseiten zu durchlaufen, bekam ich einen Fehler.
Hier ist der Code:
from selenium import webdriver
urls = open(r"C:\Users\Sayed\Desktop\script\sample.txt").readlines()
for url in urls:
driver = webdriver.Chrome(r"D:\Projects\Tutorial\Driver\chromedriver.exe")
driver.get(url)
for item in driver.find_element_by_xpath('//*[contains(@id,"showMoreHistory")]/a'):
driver.execute_script("arguments[0].click();", item)
for table in driver.find_elements_by_xpath('//*[contains(@id,"eventHistoryTable")]//tr'):
data = [item.text for item in table.find_elements_by_xpath(".//*[self::td or self::th]")]
print(data)
hier ist der fehler:
Traceback (letzter Aufruf zuletzt):
Datei “D:/Projects/Tutorial/ff.py”, Zeile 8, in for item in driver.find_element_by_xpath(‘//*[contains(@id,”showMoreHistory”)]/a’):
TypeError: Das Objekt „WebElement“ ist nicht iterierbar
Lösung
Sehen Sie sich das folgende Skript an, um die gesamte Tabelle von dieser Webseite zu erhalten. Ich habe in meinem Skript eine harcodierte Verzögerung verwendet, was keine gute Praxis ist. Sie können jedoch jederzeit definieren Explicit Wait
, um den Code robuster zu machen:
import time
from selenium import webdriver
url = 'https://www.investing.com/economic-calendar/investing.com-eur-usd-index-1155'
driver = webdriver.Chrome()
driver.get(url)
item = driver.find_element_by_xpath('//*[contains(@id,"showMoreHistory")]/a')
driver.execute_script("arguments[0].click();", item)
time.sleep(2)
for table in driver.find_elements_by_xpath('//*[contains(@id,"eventHistoryTable")]//tr'):
data = [item.text for item in table.find_elements_by_xpath(".//*[self::td or self::th]")]
print(data)
driver.quit()
Um alle Daten zu erhalten, die die show more
Schaltfläche zusammen mit der Definition erschöpfen, Explicit Wait
können Sie das folgende Skript ausprobieren:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.investing.com/economic-calendar/investing.com-eur-usd-index-1155'
driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver,10)
while True:
try:
item = wait.until(EC.visibility_of_element_located((By.XPATH,'//*[contains(@id,"showMoreHistory")]/a')))
driver.execute_script("arguments[0].click();", item)
except Exception:break
for table in wait.until(EC.visibility_of_all_elements_located((By.XPATH,'//*[contains(@id,"eventHistoryTable")]//tr'))):
data = [item.text for item in table.find_elements_by_xpath(".//*[self::td or self::th]")]
print(data)
driver.quit()
Beantwortet von – SIM
Antwort geprüft von – Dawn Plyler (FixError Volunteer)