Just create layers using arcpy.management.MakeFeatureLayer(). You can add an SQL attribute filter to each function. These are very fast because they don't actually copy the data.
Then you can use the function arcpy.Management.SelectByLocation()
There are endless combinations you can use by adding or subtracting layer sets. Each function can use the previous layer.
If the attributes are too complex for an SQL query then consider using a separate query and use an IN sql query with a list of key or OBJECTIDS. I use a SearchCursor inside a list comprehension that is converted to a tuple string. This can be used to create an expression line this
select_lay = arcpy.management.SelectByLocation('lay1', lay2, 'select_lay', 'NEW_SELECTION')
tuple = tuple([row[0] for row in arcpy.da.SearchCursor('select_lay', [key'])])
SQL_expr = """key IN {}""".format(tuple)
lay_2 = arcpy.management.MakeFeatureLayer('a_fc', ['field1'],SQL_expr)