Попытка заставить selenium получить доступ к тегам из всплывающего окна

#python #selenium #selenium-webdriver #web-scraping

#python #selenium #selenium-webdriver #веб-очистка

Вопрос:

Я новичок в python и веб-очистке, но мне захотелось взять на себя такую задачу, как эта. Не могли бы вы, пожалуйста, взглянуть на мой код и определить, что именно я делаю неправильно: код просто продолжает печатать «Null», когда я знаю, что есть данные, которые он должен выбрать. Кроме того, он выдает исключение тайм-аута после двух или трех циклов. Пожалуйста, помогите мне. Я действительно застрял.

 from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from time import sleep
import csv

filename = "Websites.csv"
with open(filename, 'w', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["Name", "Website"])

driver = webdriver.Chrome("C:/Users/Hp/Downloads/chromedriver.exe")
myurl = "https://portal-akh.de/bueroverzeichnis/liste/suchergebnisse.php"
driver.get(myurl)

Row_Num = range(2,3412)


for i in Row_Num:
    Rows = driver.find_elements_by_xpath("//table[@class='table suchergebnisse']/tbody/tr")
    
    
    try:
        Rows[i].click()
   
        Name = driver.find_element_by_xpath("//div[@class='modal hide fade in']/div/h3/font/font")
        
        Website  = driver.find_element_by_xpath("//div[@class='modal hide fade in']/div[@class='modal-body']/p/a").get_attribute('href')
        with open(filename, 'a', encoding='utf-8') as file:
            file.write(Name.text   ","   Website   "n")
    except AttributeError:
        print('Null')
        with open(filename, 'a', encoding='utf-8') as file:
            file.write("Null"   "n")
    except NoSuchElementException:
        print('Null')
        with open(filename, 'a', encoding='utf-8') as file:
            file.write("Null"   "n")
    finally:
        el = WebDriverWait(driver, 10).until(lambda d: d.find_element_by_xpath("//div[@class='modal hide fade in']/div/button[@type='button']"))
        el.click()
        
        sleep(10)

driver.close()
file.close()```

Traceback (most recent call last):
  File "d:DocumentsData Science amp; AnalyticsPycharmProjectsSeleniumMember Scrape.py", line 41, in <module>
    el = WebDriverWait(driver, 10).until(lambda d: d.find_element_by_xpath("//div[@class='modal hide fade in']/div/button[@type='button']"))
  File "C:UsersHpAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriversupportwait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
 

Комментарии:

1. Ну, вы маскируете исключения всеми этими исключениями try ….

2. Ваш скрипт не может найти элемент «website»

3. Он просто хочет записать некоторый .text и значение ahref элемента в csv.

Ответ №1:

Я не уверен, из какой ссылки вы извлекаете, но я бы сделал это примерно так. Все, что вам нужно сделать, это проверить, есть ли элемент для захвата с помощью драйвера if.find_element_by_xpath(): затем либо установите для него значение NULL, либо что угодно.

 filename = "Websites.csv"
driver.get("https://portal-akh.de/bueroverzeichnis/liste/suchergebnisse.php")
wait = WebDriverWait(driver, 10)
#Bring this outside the loop
Rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='table suchergebnisse']/tbody/tr")))
#Skipped 0
#Make len(Rows) smaller for testing
Row_Num = range(1,len(Rows))
datalist = [[]] 
for i in Row_Num:
    try:
        Rows[i].click()
        time.sleep(5)
        Name = wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='modal hide fade in' and @aria-hidden='false']/div/h3")))
        #print(Name.text)
        Website='NULL'
        #Website = wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='modal hide fade in' and @aria-hidden='false']/div[@class='modal-body']/p/a"))).get_attribute('href')
        #print(Website)
        datalist.append([Name.text,Website])
        wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='modal hide fade in' and @aria-hidden='false']//button[@class='close']"))).click()
    except Exception as e:
        #datalist.append(['NULL','NULL'])
        print(i,e)
        pass
df = pd.DataFrame(datalist,columns =['Name', 'Link'])
print(df)
df.to_csv(filename, index = False) 
 

Выводит

                   Name  Link
                  None  None
        Abeling, Sören  NULL
  Abendroth, Christian  NULL
       Achilles, Heiko  NULL
 

Импорт

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
 

Комментарии:

1. Большое спасибо. Извините, что не добавил комментарии к моему коду. Что-то новое узнал. 🙂

2. Спасибо Arundeep. Ссылки href, которые я пытаюсь получить, находятся не во всех строках. Они встречаются в некоторых, но не во всех. например: строка 32. Как мне изменить код, чтобы захватить их и заполнить «Null» для тех, у кого их нет?

3. Ну, сначала вы проверяете, есть ли driver.find_element_by_xpath(‘yourpath’): тогда вы можете просто установить для него значение ‘null’ вместо этого в else.