[FIXED] python selenium kratzt den ganzen Tisch

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 moreSchaltfläche zusammen mit der Definition erschöpfen, Explicit Waitkö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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like