Если вы хотите сделать это с помощью запросов, вам нужно перепроектировать сайт. Откройте инструменты разработчика в Chrome, выберите вкладку сети и заполните форму.
Это покажет вам, как сайт загружает данные. Если вы покопаетесь на сайте, то увидите, что он захватывает данные, выполняя POST к этой конечной точке: https://careers.microsoft.com/widgets. Он также показывает полезную нагрузку, которую использует сайт. Сайт использует файлы cookie, поэтому все, что вам нужно сделать, это создать сеанс, в котором хранятся файлы cookie, получить его и скопировать / вставить полезную нагрузку.
Таким образом, вы сможете извлечь те же самые json-данные, которые выбирает javascript для динамического заполнения сайта.
Ниже приведен рабочий пример того, как это будет выглядеть. Осталось только разобрать json, как считаете нужным.
import requests
from pprint import pprint
# create a session to grab a cookie from the site
session = requests.Session()
r = session.get("https://careers.microsoft.com/us/en/")
# these params are the ones that the dev tools show that site sets when using the website form
payload = {
"lang":"en_us",
"deviceType":"desktop",
"country":"us",
"ddoKey":"refineSearch",
"sortBy":"",
"subsearch":"",
"from":0,
"jobs":"true",
"counts":"true",
"all_fields":["country","state","city","category","employmentType","requisitionRoleType","educationLevel"],
"pageName":"search-results",
"size":20,
"keywords":"",
"global":"true",
"selected_fields":{"city":["Hyderabad"],"country":["India"]},
"sort":"null",
"locationData":{}
}
# this is the endpoint the site uses to fetch json
url = "https://careers.microsoft.com/widgets"
r = session.post(url, json=payload)
data = r.json()
job_list = data['refineSearch']['data']['jobs']
# the job_list will hold 20 jobs (you can se the parameter in the payload to a higher number if you please - I tested 100, that returned 100 jobs
job = job_list[0]
pprint(job)
Приветствие.