@mikhal_ivanych

Как правильно парсить по нескольким ссылкам на одном сайте?

Всем привет.

Есть следующая задача (практикуюсь): спарсить название вакансии и ее ссылку с сайта.
Первоначальная ссылка на сайт показывает вакансии в одном городе. После успешного парсинга вакансий из этого города нажимаю кнопку другого города для парсинга следующей порции вакансий. И на этом этапе ничего не происходит - появляется ошибка:
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

По логике я хотел переходить от одного города к другому и парсить вакансии. Далее я все добавлю в список и загружу в бд.

Вторая проблема:
При парсинге вакансии название тащит за собой тексты дочерних элементов. Как можно это запретить?
Результат сейчас:
'title': 'Director, Reward & People OperationsLocationBerlin, Vienna, BarcelonaTime TypeFull time'
Желаемый результат:
'title': 'Director, Reward & People Operations'

Третья проблема:
Использование абсолютного пути в xpath. Пока не трогаю - потом исправлю.

Понятно что код можно сделать намного эффективнее, но у меня сейчас не стоит такая задача. Хотелось бы получить сначала работающий скрипт. Но полезным советам по организации данного кода буду благодарен.

Спасибо.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from datetime import date
import sqlite3

chromedriver = 'C:\\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('https://n26.com/en/careers/locations/57663')

while True:
	try:
		WebDriverWait(driver, 20).until(
			EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div[2]/div/div[3]/button[1]'))).click()
	except TimeoutException:
		break

jobs = []

section = driver.find_elements_by_xpath("//ul[@class='ah aj al an ap aq jp kd ke kf kg']//li")

for i in section:
	a = i.find_element_by_css_selector("a")

	job = {
		'title': a.get_property('text'),
		'href': a.get_attribute("href")
	}

	print(job)
	jobs.append(job)

driver.execute_script("window.scrollTo(0, 300)")

driver.find_element_by_xpath("//a[@href='/en/careers/locations/49747']").click()

section2 = driver.find_elements_by_xpath("//ul[@class='ah aj al an ap aq jp kd ke kf kg']//li")

for i in section:

	b = i.find_element_by_css_selector("a")

	job2 = {
		'title': b.get_property('text'),
		'href': b.get_attribute("href")
	}

	print(job2)
	jobs.append(job2)

# print(jobs)


5ed50e9172c9a608105063.jpeg
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 2
alekciy
@alekciy
Вёбных дел мастер
В выражениях при поиске по имени класса лучше использовать функцию contains. Подробности: XPath это сильно!
Ответ написан
@mikhal_ivanych Автор вопроса
Тут я соглашаюсь с cookie на сайте.

while True:
	try:
		WebDriverWait(driver, 20).until(
			EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div[2]/div/div[3]/button[1]'))).click()
	except TimeoutException:
		break
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы