Search code examples
pythonweb-scrapingbeautifulsoup

How do I web-scrape td-class elements from a webpage with multiple embeded tabs


I have been having trouble running the code below using python web-scraping program and it seems to print text from multiple tabs instead of just the singular "enhanced form" tab found on the webpage. How do I fix this so that its able to print a single td-class text from the page elements?

note: I'm printing this in excel spreadsheets.

Edit: excellent work Andrej

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

url = "https://www.racingandsports.com.au/form-guide/thoroughbred/australia/cranbourne/2024-04-26/R8/enhanced-form"

# Send a GET request to the URL
response = requests.get(url)

# Check if the request was successful (status code 200)
if response.status_code == 200:
    # Parse the HTML content
    soup = BeautifulSoup(response.content, "html.parser")
    
    # Find the first table with id "tblStats"
    table = soup.find("table", {"id": "tblStats"})
    
    if table:
        # Create a new Excel workbook
        wb = Workbook()
        ws = wb.active
        ws.title = "Data"
        
        # Find all table rows (tbody > tr)
        rows = table.find("tbody").find_all("tr")
        
        # Loop through each row
        for row_index, row in enumerate(rows, start=1):
            # Find all table data (td)
            tds = row.find_all("td")
            
            # Get the text from the 6th table data element if it exists
            data = tds[5].get_text(strip=True)
            
            # Write the data to the Excel worksheet
            ws.cell(row=row_index, column=1, value=data)
        
        # Save the workbook
        wb.save("output.xlsx")
        print("Data written to output.xlsx successfully.")
    else:
        print("Table with id 'tblStats' not found.")
else:
    print("Failed to retrieve the webpage. Status code:", response.status_code)

Solution

  • To load the page correctly use html5lib parser in BeautifulSoup, e.g.:

    from io import StringIO
    
    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    
    url = "https://www.racingandsports.com.au/form-guide/thoroughbred/australia/cranbourne/2024-04-26/R8/enhanced-form"
    
    soup = BeautifulSoup(requests.get(url).content, "html5lib")
    table = soup.select_one("#tblStats")
    
    df = pd.read_html(StringIO(str(table)))[0]
    print(df)
    

    Prints:

        Tab   FORM               Horse    WT  BP  Tot $PM Car$/St                Jockey    Joc L50      Joc PM   JRat                            Trainer    Tra L50      Tra PM   TRat   EST   LSR   50D   BL3   12m   Car  RT GF  RT D  RT SH  12M AW  50D AW  NR  HCP  PR  BP.1  12TB  12TM  12TT3  100TB  12AWB  12AWM  12AWT3  100AWM  WT TS  + | -  BP TS  BP LS DIST LS + | -.1  CLS LS  LS Fav TS JockeyTS RatingTS J/H  LS JockeyLS RatLS J/H                            TrainerRating     Location              TC  Joc/Hor  Career  12 Month  Course  C&D  Dist  Firm  Good  Soft  Heavy  Group 1  Joc L50.1  Joc L350  Tra L50.1  Tra L350  Sire L50  Sire L350  Hor & Crs  Joc & Crs  Tra & Crs     PP Unnamed: 72 Unnamed: 73
    0     1  09x18       BOLD RESPONSE  62.0   4   $94.9k   $6.3k      LOGAN BATES (a3)    $244.3k     $522.9k    2.1                      JULIUS SANDHU    $309.4k   $2,791.0k    2.8  34.0  18.5  33.0  33.0  34.0  34.0   34.0   0.0   33.0     0.0       0   7  NaN   9    16  71.4  73.7   73.4    0.0    0.0    0.0     0.0     0.0   62.0    2.5      4      8   1000m    200m    BM64       -          LOGAN BATES 2.1        LOGAN BATES 3.2                        JULIUS SANDHU 2.8   Cranbourne               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $59.7         NaN         NaN
    1     2  7116x          KING'S TAJ  61.5  10   $70.1k   $6.4k           LUKE CURRIE    $601.5k   $3,380.0k    2.5                     A & S FREEDMAN    $350.0k  $11,823.2k  H 4.4  28.0  32.5   0.0  33.0  34.0  35.0   33.0   0.0   35.0     0.0       0   5  NaN   1    11  72.0  72.0   72.0    0.0    0.0    0.0     0.0     0.0   61.5    2.5     10      3   1600m   -400m     NMW       -          LUKE CURRIE 2.5        DAMIAN LANE 4.7                     A & S FREEDMAN H 4.4   Flemington               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $24.6         NaN         NaN
    2     3  6096x        ALTAI RANGER  61.0   6  $163.3k   $7.4k             BEN ALLEN    $378.5k   $3,072.0k    3.9                        JOHN SADLER    $204.2k   $2,354.2k    3.4  28.5  31.0   0.0  35.5  37.0  41.0   41.0   0.0   40.0    31.0       0   6  NaN   0    11  72.8  72.8   72.8    0.0   71.0   71.0    71.0     0.0   61.0    1.5      6      2   1200m       0    BM70       -            BEN ALLEN 3.9          BEN ALLEN 3.5                          JOHN SADLER 3.4  Pakenham OC               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $39.8         NaN         NaN
    3     4  147x2           ESECUTORE  60.5   8   $76.2k  $12.7k     LAUREN BURKE (a3)    $217.9k     $356.0k    3.5                        MATT LAURIE  $1,378.1k   $3,788.1k  H 3.8  35.5  33.5  34.0  37.5  37.5  37.5   37.5   0.0   34.0     0.0       0  21  NaN  13    10  70.7  71.0   71.0    0.0    0.0    0.0     0.0     0.0   60.5    0.0      8      1   1000m    200m    BM64       -         LAUREN BURKE 3.5        ETHAN BROWN 4.0                        MATT LAURIE H 3.8   Mornington               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN   $7.6         NaN         NaN
    4     5  22346         I AM CAVIAR  60.5   9   $68.2k   $5.7k            LUKE NOLEN    $419.4k  $13,946.9k    2.8  PETER G MOODY & KATHERINE COLEMAN  $3,751.6k  $10,677.1k  H 3.3  39.0  33.5  38.5  38.5  40.5  40.5   38.5   0.0   36.5    40.5       0  42  NaN  61    11  70.4  70.7   70.8   70.7   71.9   71.9    71.9     0.0   60.5    3.0      9      9   1000m    200m    BM70       -           LUKE NOLEN 2.8        LINDA MEECH 3.6  PETER G MOODY & KATHERINE COLEMAN H 3.3  Pakenham OC               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $17.6         NaN         NaN
    5     6  30531            SUPERSET  60.5   1   $82.5k   $6.3k        JACKIE BERIMAN    $126.4k     $683.3k    2.0                     SHAWN MATHRICK    $204.7k   $1,515.3k    3.9  32.5  32.0  32.0  32.0  32.0  44.5   39.5   0.0   44.5     0.0       0   5  NaN   9    17  71.2  71.7   71.7   71.2    0.0    0.0     0.0     0.0   60.5   -1.0      1      5   1200m       0    BM58       -       JACKIE BERIMAN 2.0     JACKIE BERIMAN 1.9                       SHAWN MATHRICK 3.9   Cranbourne               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $39.8         NaN         NaN
    6     7  2212x           ACID WASH  59.5   -   $68.8k  $17.2k             JAMIE KAH  $2,000.1k  $10,826.9k  H 4.3                   CLINTON MCDONALD  $1,885.8k   $4,664.8k    3.5  33.0  37.0   0.0  37.5  37.5  37.5   37.5   0.0    0.0     0.0       0  15  NaN   1    17  70.4  70.9   70.9    0.0    0.0    0.0     0.0     0.0   59.5    1.5      1      6   1500m   -300m    BM70  Beaten          JAMIE KAH H 4.3          JAMIE KAH 3.0                     CLINTON MCDONALD 3.5   Cranbourne               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN    Scr         Scr         Scr
    7     8    13x            THE OPEN  59.5   7   $19.8k   $9.9k            BILLY EGAN    $232.2k   $3,384.0k  H 3.0                      PATRICK PAYNE    $342.2k   $2,898.1k  H 4.1  32.0  36.0   0.0  36.0  36.0  36.0   36.0   0.0    0.0     0.0       0   6  NaN   1    12  68.8  69.5   69.5    0.0    0.0    0.0     0.0     0.0   59.5   -0.5      7      6   1200m       0     CL1       -         BILLY EGAN H 3.0         BILLY EGAN 3.5                      PATRICK PAYNE H 4.1     Plumpton               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN   $6.4         NaN         NaN
    8     9    1x6      MR CHARISMATIC  59.0   -   $33.8k  $16.9k           JAKE NOONAN    $242.2k   $1,477.6k    2.4               BEN, WILL & JD HAYES    $765.9k   $4,882.6k  H 4.3  25.0  25.5  26.0  34.5  34.5  34.5   34.5   0.0   26.0     0.0       0   4  NaN   7    10  71.0  72.2   72.2   73.4    0.0    0.0     0.0     0.0   59.0   -0.5     14      1   1200m       0    BM64       -          JAKE NOONAN 2.4        MICHAEL DEE 4.0               BEN, WILL & JD HAYES H 4.3  Pakenham OC               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN    Scr         Scr         Scr
    9    10  2x721      PERI PERI RICH  59.0   -   $86.6k   $4.3k     EMILY POZMAN (a3)    $189.1k     $382.5k    3.0                     MICHAEL HUGLIN    $202.4k   $1,601.2k    3.2  31.5  32.5  32.5  32.5  32.5  33.0   32.5   0.0   33.0    32.0       0   5  NaN   9    11  71.3  73.8   72.2   71.3   71.4   72.4    72.4     0.0   59.0    0.0     10      6   1200m       0    BM58       -         EMILY POZMAN 3.0       EMILY POZMAN 2.0                       MICHAEL HUGLIN 3.2  Pakenham OC               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN    Scr         Scr         Scr
    10   11    517  SUPERCONSTELLATION  59.0   3   $32.3k  $10.8k         JORDAN CHILDS    $390.0k   $2,915.2k  H 4.3                    ENVER JUSUFOVIC    $406.3k   $3,348.5k    4.2  34.0  30.5  32.5  32.5  32.5  32.5   32.5   0.0   31.0     0.0       0   6  NaN   9    12  70.2  71.1   71.1   70.2    0.0    0.0     0.0     0.0   59.0    0.0      3      9   1200m       0  BM0-64       -      JORDAN CHILDS H 4.3          BEN ALLEN 4.1                      ENVER JUSUFOVIC 4.2   Cranbourne               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $19.9         NaN         NaN
    11   12      1             ULUWATU  57.0   -   $22.0k  $22.0k         WINONA COSTIN    $243.8k   $1,910.1k    3.9                    ANNABEL NEASHAM    $509.9k   $4,978.7k  H 3.7  32.5  33.0  33.5  33.5  33.5  33.5    0.0   0.0   33.5     0.0       0   5  NaN  10     0  73.8  73.8   73.8   73.8    0.0    0.0     0.0     0.0   57.0    0.0     16      8   1200m       0     MDN       -        WINONA COSTIN 3.9      WINONA COSTIN 4.0                    ANNABEL NEASHAM H 3.7     Pakenham               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN    Scr         Scr         Scr
    12   13  29612               BRIER  59.0  12   $45.0k   $7.5k  LUKE CARTWRIGHT (a3)    $155.9k   $1,058.7k  H 3.0                    ENVER JUSUFOVIC    $406.3k   $3,348.5k    4.2  31.5  31.5  31.5  31.5  34.0  34.0   31.5   0.0   34.0     0.0       0   5  NaN   9     9  70.3  71.0   70.8   71.0    0.0    0.0     0.0     0.0   59.0    2.5     12      5   1200m       0  BM0-64  Beaten    LUKE CARTWRIGHT H 3.0   MS DAKOTAH KEANE 3.6                      ENVER JUSUFOVIC 4.2   Cranbourne               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $11.7         NaN         NaN
    13   14  43712     EAMONN'S MEMORY  59.0  11  $125.8k   $2.7k           CORY PARISH     $77.3k     $579.8k    1.6                        ANDREW DALE    $129.9k     $671.8k    2.2  32.0  33.0  33.0  33.0  33.0  33.0   33.0   0.0   28.5    21.0       0   5  NaN   9     6  69.6  70.7   70.8   70.7    0.0    0.0     0.0     0.0   59.0   -3.0     11      9   1200m       0    BM58       -          CORY PARISH 1.6        CORY PARISH 1.7                          ANDREW DALE 2.2   Wangaratta               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $39.8         NaN         NaN
    14   15  1x69x      SAVILLE STREET  58.5   5    $8.2k   $2.7k          BEAU MERTENS    $234.0k   $4,222.4k  H 4.2               BEN, WILL & JD HAYES    $765.9k   $4,882.6k  H 4.3  28.5  28.0   0.0  37.0  37.0  37.0    0.0   0.0   31.0    37.0       0   5  NaN   0    16   0.0   0.0    0.0    0.0    0.0    0.0     0.0     0.0   58.5   -0.5      5     10   1429m   -229m    BM64       -       BEAU MERTENS H 4.2  DANIEL STACKHOUSE 3.1               BEN, WILL & JD HAYES H 4.3   Flemington  BEN & JD HAYES      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $39.8         NaN         NaN
    15   16  665x4    FROM PANTHERLAND  58.5   2  $111.4k   $4.0k       PATRICK MOLONEY    $218.3k   $1,514.7k    3.8                         K & K KEYS    $222.3k   $1,786.6k    2.4  32.0  31.5  31.5  36.0  38.5  44.0   44.0   0.0   39.0     0.0       0   7  NaN   3    11  73.1  73.1   73.1    0.0    0.0    0.0     0.0     0.0   58.5    0.0      2      4   1100m    100m    BM64       -      PATRICK MOLONEY 3.8   BLAIKE MCDOUGALL 3.6                           K & K KEYS 2.4   Cranbourne               N      NaN     NaN       NaN     NaN  NaN   NaN   NaN   NaN   NaN    NaN      NaN        NaN       NaN        NaN       NaN       NaN        NaN        NaN        NaN        NaN  $39.8         NaN         NaN