Scraping game data from web My code currently:
import os
import pandas as pd
from selenium import webdriver
from tabulate import tabulate
from datetime import datetime
import time
from bs4 import BeautifulSoup as bs

start = datetime.now()

browser = webdriver.Chrome()


class GameData:

    def __init__(self):
        self.date = []
        self.time = []
        self.game = []
        self.score = []
        self.home_odds = []
        self.draw_odds = []
        self.away_odds = []


def parse_data(url):
    browser.get(url)
    df = pd.read_html(browser.page_source, header=0)[0]
    time.sleep(3)
    html = browser.page_source
    soup = bs(html,&quot;lxml&quot;)
    cont = soup.find('div', {'id':'wrap'})
    conti = cont.find('div', {'id':'col-content'})
    content = conti.find('table', {'class':'table-main'}, {'id':'tournamentTable'})
    main = content.find('th', {'class':'first2 tl'})
    count = main.findAll('a')
    country = count[1].text
    league = count[2].text
    game_data = GameData()
    game_date = None
    for row in df.itertuples():
        if not isinstance(row[1], str):
            continue
        elif ':' not in row[1]:
            game_date = row[1].split('-')[0]
            continue
        game_data.date.append(game_date)
        game_data.time.append(row[1])
        game_data.game.append(row[2])
        game_data.score.append(row[3])
        game_data.home_odds.append(row[4])
        game_data.draw_odds.append(row[5])
        game_data.away_odds.append(row[6])
    browser.quit()
    return game_data, country, league

# You can input as many URLs you want
urls = {
&quot;https://www.oddsportal.com/soccer/europe/champions-league/results/&quot;
}

if __name__ == '__main__':

    results = None

    for url in urls:
        game_data, country, competition = parse_data(url)
        result = pd.DataFrame(game_data.__dict__)
        result['country'] = country
        result['competition'] = competition
        if results is None:
            results = result
        else:
            results = results.append(result, ignore_index=True)


results

|    | date        | time   | game                                 | score   |   home_odds |   draw_odds |   away_odds | country   | competition      |
|----|-------------|--------|--------------------------------------|---------|-------------|-------------|-------------|-----------|------------------|
|  0 | 17 Mar 2021 | 20:00  | Bayern Munich - Lazio                | 2:1     |        1.35 |        6.02 |        7.53 | Europe    | Champions League |
|  1 | 17 Mar 2021 | 20:00  | Chelsea - Atl. Madrid                | 2:0     |        2.33 |        3.1  |        3.49 | Europe    | Champions League |
|  2 | 16 Mar 2021 | 20:00  | Manchester City - B. Monchengladbach | 2:0     |        1.28 |        6.25 |       10.17 | Europe    | Champions League |
|  3 | 16 Mar 2021 | 20:00  | Real Madrid - Atalanta               | 3:1     |        2.26 |        3.6  |        3.16 | Europe    | Champions League |
|  4 | 10 Mar 2021 | 20:00  | Liverpool - RB Leipzig               | 2:0     |        2.37 |        3.8  |        2.85 | Europe    | Champions League |

How can I make this code better for readability?
Also, since CR is asking to explain further, (mods can delete this)
Some quick comments. Since your request is about readability, you can do three things at least:

get rid of unused variables eg: start = datetime.now()
improve the naming conventions for your variables: variables like cont or conti are quite similar (risk of typos/confusion) but the names are not intuitive and do not accurately describe the data you are manipulating. count is also too generic to be meaningful. Note that game_date looks confusingly similar to game_data and you even have a line: game_data.date.append(game_date). I think the risk of typo bugs is not negligible here.
add some line spacing here and there, plus a few comments. You can afford it as the code is less than 100 lines of code, so the implementation is reasonable and not bloated.

I don't think the class GameData is really useful the way it is implemented. To get the final printable result you could stick with a dataframe, you already have one, so see if it can be transformed further or transposed to another.
You have time.sleep after pd.read_html, but it does not guarantee that the page will be fully loaded. There are several functions in Selenium that you can use to wait for the presence of a given element. But probably you could use the requests module instead. On sites that use JS/Ajax, you may have no other choice but to use Selenium, but it takes more effort to do it right.
It would be good to add some validation to make sure that the result of your scraping is not void. Otherwise the processing will be wrong and return garbage. The BS find function will return None if the element is not found. So all you have to do is something like:
if None in (cont, conti, content, main):

or you can use the any function for this purpose.
However, findAll has a different behavior and will return an empty list if there is no matching element found.