Items derived from one function are getting printed within another for loop in another function
First of all, usual things (I feel like I'm suggesting these things in most of the web-scraping related discussions):

initialize session as requests.Session() and use session.get() instead of requests.get() - this would speed things up because the underlying TCP connection will be re-used for subsequent queries to the same domain
use SoupStrainer to limit what is parsed when the &quot;soup&quot; object is initialized

And, I am not completely sure about the reliability of the .pull_right a selector. At this point, it reads that you want to follow the link that is on the right in its respective container. The position of the element on the screen may easily change with a design change. What about a selector like a[id*=ReadMore] or .more &gt; a?
Also, note that select()[0] could be replaced with select_one().
Code Style
There is not a lot of things to point out since the code is rather short and straightforward, but there are some PEP8 violations that can be addressed:

watch for the use of blank lines
you miss spaces between the function arguments
url should be named URL, since it is a &quot;constant&quot;
use a single # for comments
group imports properly

Some of the variable names could be more explicit, e.g. event_date in place of ev_date, event_link instead of i_link.
The improved code
from urllib.parse import urljoin

from bs4 import BeautifulSoup, SoupStrainer
import requests

URL = 'replace_with_the_above_link'


def glean_items(session, main_link):
    response = session.get(main_link)
    
    parse_only = SoupStrainer(class_='course-list-item')
    soup = BeautifulSoup(response.text, &quot;lxml&quot;, parse_only=parse_only)
    for item in soup.select('.course-list-item'):
        event = item.select_one(&quot;.lead&quot;).text
        date = item.select_one(&quot;.date&quot;).text
        link = urljoin(main_link, item.select_one(&quot;.pull-right a&quot;)['href'])

        parse_more(session, event, date, link)


def parse_more(session, event_name, event_date, event_link):
    response = session.get(event_link)
    
    parse_only = SoupStrainer(class_=&quot;e-loc-cost&quot;)
    soup = BeautifulSoup(response.text, &quot;lxml&quot;, parse_only=parse_only)
    for items in soup.select('.e-loc-cost'):
        location = ' '.join([' '.join(item.text.split()) for item in items.select(&quot;.event-add&quot;)])
        cost = ' '.join([' '.join(item.text.split()) for item in items.select(&quot;.costs&quot;)])
        
        print(event_name, event_date, location, cost)


if __name__ == '__main__':
    with requests.Session() as session:
        glean_items(session, URL)