Мы пытаемся разобрать href
атрибуты из DOM сайта вакансий. Мы хотим получать href
за каждую работу.
Обычно мы используем пути CSS и передаем их методу Selenium find_elements_by_css.
К сожалению, мы заметили, что плагин браузера SelectorGadget не может предоставить нам путь CSS. Мы продолжили использовать путь CSS с помощью Google Chrome (ctrl+shift+c). Chrome может извлечь путь, но ни Selenium, ни BeautifulSoup не могут работать с этими путями.
После многих неудачных попыток извлечь элементы, используя разные классы и теги, мы считаем, что что-то совершенно не так либо с нашим подходом, либо с веб-сайтом. Мы предполагаем, что Selenium и BeautifulSoup по какой-то причине не могут разобрать желаемые элементы? Могут ли теги iframe
в DOM быть источником ошибки (см. этот ТАК вопрос)? Из-за чего синтаксический анализ здесь не работает, и есть ли способ обойти эту проблему? Источник проблемы, связанный с веб-сайтом, также объясняет, почему SelectorGadget изначально не смог получить путь. Наш вывод будет заключаться в том, чтобы использовать регулярные выражения для извлечения необходимых нам атрибутов href
. Это будет только крайним решением.
Для говорящих на немецком языке обратите внимание на орфографическую ошибку в целевых элементах: <div class = "stellenagebot">
. Пожалуйста, не позволяйте себе запутаться в них (как это сделали мы).
Не повезло с BeautifulSoup:
import re
import requests
from bs4 import BeautifulSoup
url = 'https://www.artemiskliniken.de/Karriere/%C3%84rzte/'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
print(soup.prettify())
# Out: ...
#<div class = "col-md-4 wow fadeInUp">
# <div class = "stellenagebot">
# <h3>
# Facharzt (m/w/d) für Augenheilkunde in Voll- oder Teilzeit
# </h3>
# <h4>
# Erfurt
# </h4>
# <a class = "btn btn-default" href = "/Stellenangebot/Facharzt_Augenheilkunde_Erfurt/">
# Mehr
# </a>
# </div>
#</div>
#<div class = "col-md-4 wow fadeInUp">
# <div class = "stellenagebot">
# <h3>
# Facharzt (m/w/d) für Augenheilkunde in Voll- oder Teilzeit
# </h3>
# <h4>
# Eschwege
# </h4>
# <a class = "btn btn-default" href = "/Stellenangebot/Facharzt_Augenheilkunde_Eschwege/">
# Mehr
# </a>
# </div>
#</div>
# ...
print(soup.find_all('.stellenagebot'))
# Out: []
print(soup.find_all(string=re.compile("Stellenangebot")))
# ['Stellenangebote Facharzt für Augenheilkunde und Karrierewege für Ärzte', '<h3>Zur Verstärkung unseres Teams suchen wir:</h3>\n\n<p class = "hyphenate" lang = "de"> </p>\n\n<div id=\'jobauflistung\' class=\'row\'><div class=\'col-md-4 wow fadeInUp\'><div class = "stellenagebot">\n<h3>Facharzt (m/w/d) für Augenheilkunde in Voll- oder Teilzeit</h3>\n\n<h4>Aachen</h4>\n<a class = "btn btn-default" href = "/Stellenangebot/Facharzt_Augenheilkunde_Aachen/">Mehr</a></div></div><div class=\'col-md-4 wow fadeInUp\'><div class = "stellenagebot">\n<h3>Facharzt (m/w/d) fü
# ...
# ></div>\n</div>\n</div>\n</div>\n</footer>\n</div><!-- AUF ALLEN SEITEN IN DEN BODY-TAG EINFÜGEN ']
print(len(soup.find_all(string=re.compile("Stellenangebot"))))
# Out: 2
Также не повезло с Selenium:
from selenium import webdriver
from job_scraper.configuration import CHROMEDRIVER_VERSION, ROOT_PATH, \
CHROME_OPTIONS
driver = webdriver.Chrome(
ROOT_PATH / f'assets/chrome_drivers/{CHROMEDRIVER_VERSION}',
options=CHROME_OPTIONS
)
driver.maximize_window()
driver.get(url)
driver.find_elements_by_css_selector('.stellenagebot')
# Out: []
когда я проверяю страницу в веб-браузере, я вижу stellenagebot
только в HTML в комментарии <!-- .... -->
, поэтому BeautifulSoup
и Selenium
не рассматривают его как HTML, а обычную строку в комментарии. Так что, возможно, придется получить текст из comment
и проанализировать его отдельно.
эта страница использует JavaScript в таблице, поэтому я не вижу никаких href
в отображаемой таблице, потому что URL-адреса скрыты где-то в JavaScript. Я вижу href
только в HTML в комментарии.
Спасибо за эту справочную информацию! @фурас
Элемент, который вы ищете, находится внутри comments
. вам нужно сначала получить информацию об этом теге, а затем преобразовать в строку, а затем снова проанализировать, чтобы получить значение.
from bs4 import Comment
import requests
url = 'https://www.artemiskliniken.de/Karriere/%C3%84rzte/'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
#Capture Comments element
comments = soup.find_all(text=lambda text:isinstance(text, Comment))
Newsoup = BeautifulSoup(''.join(comments), 'html.parser')
for item in Newsoup.select('[href* = "Stellenangebot"]'):
print(item['href'])
Выход:
/Stellenangebot/Facharzt_Augenheilkunde_Aachen/
/Stellenangebot/Facharzt_Augenheilkunde_Bad_Berleburg/
/Stellenangebot/Facharzt_Augenheilkunde_Bad_Hersfeld/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Beckum/
/Stellenangebot/Facharzt_Augenheilkunde_Beckum/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Dieburg/
/Stellenangebot/Facharzt_Augenheilkunde_Dieburg /
/Stellenangebot/Facharzt_Augenheilkunde_Dillenburg/
/Stellenangebot/Facharzt_Augenheilkunde_Duisburg/
/Stellenangebot/Facharzt_Augenheilkunde_Erfurt/
/Stellenangebot/Facharzt_Augenheilkunde_Eschwege/
/Stellenangebot/Facharzt_Augenheilkunde_Frankfurt/
/Stellenangebot/Facharzt_Augenheilkunde_Helmstedt/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Heppenheim/
/Stellenangebot/Facharzt_Augenheilkunde_Herborn/
/Stellenangebot/Facharzt_Augenheilkunde_Hoyerswerda/
/Stellenangebot/Facharzt_Augenheilkunde_Koeln/
/Stellenangebot/Facharzt_Anaesthesie/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Leverkusen/
/Stellenangebot/Facharzt_Augenheilkunde_Limburg/
/Stellenangebot/Facharzt_Augenheilkunde_Mainz/
/Stellenangebot/Facharzt_Augenheilkunde_Marburg/
/Stellenangebot/Facharzt_Augenheilkunde_Melsungen/
/Stellenangebot/Facharzt_Augenheilkunde_Moers/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Moers/
/Stellenangebot/Facharzt_Augenheilkunde_Moerfelden/
/Stellenangebot/Facharzt_Augenheilkunde_Muehlhausen/
/Stellenangebot/Facharzt_Augenheilkunde_Isenburg/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Oberhausen/
/Stellenangebot/Facharzt_Augenheilkunde_Oberhausen/
/Stellenangebot/Facharzt_Augenheilkunde_Obertshausen/
/Stellenangebot/Facharzt_Augenheilkunde_Oberursel/
/Stellenangebot/Facharzt_Augenheilkunde_Offenbach/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Offenbach/
/Stellenangebot/Facharzt_Augenheilkunde_Ruesselsheim/
/Stellenangebot/Facharzt_Augenheilkunde_Salzkotten/
/Stellenangebot/Facharzt_Augenheilkunde_Wetzlar/
/Stellenangebot/Facharzt_Augenheilkunde_Wiesbaden/
если элемент находится в
iframe
, то он рассматривается как отдельная страница, и вы должны ее загрузить.Selenium
имеет дажеswitch_to.frame(...)
загрузку контента вiframe
.BeatifulSoup
не будет анализировать элементы вiframe
, потому что это не часть текущей страницы, и вам нужно получить URL-адрес изiframe
и загрузить его с помощьюrequests