Selenium Python. Как получить ссылки из уведомлений на Ютубе?
Авторизовался скриптом и кликнул на уведомления. Но как вывести все ссылки с этой формы? Использовал модуль htmldom, но результатов никаких. Вот код метода:
def authorization(self):
driver = './geckodriver'
browser = webdriver.Firefox(executable_path=driver)
browser.get('https://www.livejournal.com/identity/login.bml?type=google&auto_forwhat=wwws%24/')
enterFirst = browser.find_element_by_class_name('RveJvd')
login = browser.find_element_by_id('identifierId')
time.sleep(2)
login.send_keys('mylogin')
enterFirst.click()
time.sleep(2)
password = browser.find_element_by_name('password')
enterSecond = browser.find_element_by_id('passwordNext')
password.send_keys('mypassword')
enterSecond.click()
browser.get('https://www.youtube.com')
time.sleep(5)
notifications = browser.find_element_by_class_name('ytd-notification-topbar-button-renderer')
notifications.click()
urls = []
dom = htmldom.HtmlDom("https://www.youtube.com")
dom = dom.createDom()
p_links = dom.find('a class="yt-simple-endpoint style-scope ytd-notification-renderer"')
for link in p_links:
print ("URL: " +link.attr("href"))
time.sleep(100)
Что неправильно?
Ответы (2 шт):
Автор решения: Wairua
→ Ссылка
Без претензии на ответ. Просто раз уж автор заморочился с selenium поделюсь тем, чем пользуюсь сам. Мне так удобней:
from distutils.util import get_platform
from os import mkdir, path
from selenium.common.exceptions import *
from selenium.webdriver import Firefox
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.firefox.webelement import FirefoxWebElement
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
class FirefoxBrowser(Firefox):
def __init__(self,
silent_mode: bool = False,
driver: str = 'geckodriver',
close_timeout: int = 0,
max_window: bool = True,
no_images: bool = True):
"""
:param silent_mode: логическое, по умолчанию False отвечает за отображение окна браузера. Если запуск происходит
из под Windows можно применить значение, True (отобразить окно), при запуске в Linux окно всегда скрыто;
:param driver: указывает расположение файла `geckodriver`. Если файл находится не в дериктории проекта,
необходимо указать полный путь к файлу, или добавить путь к файлу в переменную PATH;
:param close_timeout: время задержки до закрытия окна браузера после завершения работы. По умолчани 0 сек.;
:param max_window: параметр отвечающий за развертывание окна браузера до максимального размера при запуске
:param no_images: блокировка изобращений на сайтах.
"""
self.__close_timeout = close_timeout
if get_platform().partition('-')[0] == 'linux':
silent_mode = True
max_window = False
opt = FirefoxOptions()
opt.headless = silent_mode
profile = FirefoxProfile()
if no_images:
profile.set_preference('permissions.default.image', 2)
if not path.exists('./logs/'):
mkdir('./logs/')
super().__init__(options=opt,
executable_path=driver,
firefox_profile=profile,
service_log_path='./logs/geckodriver.log')
if max_window:
self.maximize_window()
def scroll_to_element(self, element: FirefoxWebElement):
self.execute_script("arguments[0].scrollIntoView();", element)
def wait_for_element(self, by: By, ident: str, timeout: int = 5):
try:
WebDriverWait(self, timeout).until(
expected_conditions.presence_of_all_elements_located(
(by, ident)
)
)
return self.find_element(by, ident)
except TimeoutException:
return None
@property
def action(self):
return ActionChains(self)
Автор решения: Никита Климов
→ Ссылка
Проблема была решена отбросом всех костылей типа htmldom и bs4. Были использованы регулярные выражения (модуль re). А для просмотра исходника веб-страницы - простая функция:
element = browser.page_source
Далее:
urls = re.findall(r'(?:<a class="yt-simple-endpoint style-scope ytd-notification-renderer" tabindex="0" role="link" href=")(.*)">', element)
print(urls)
Всем спасибо.
Обратите внимание на мой код: он полностью решает проблему автоматической авторизации на Гугле.