Я совершенно новичок в парсинге (и первый пост здесь), но с помощью BeautifulSoup мне удалось написать код, который выводит список скачек за весь день и выводит их список, например, 1 скачку ниже:
<li class = "w-racecard-grid-race-result" title = "IRISH STALLION FARMS EBF TOTAL ENJOYMENT MARES I.N.H. FLAT (Listed)">
<a href = "/horse-racing/result/fairyhouse/2023-04-08/1740/208/7">
<span><b>17:40</b> Bumper</span>
<span>2m 90y</span>
<span>Listed</span>
</a>
</li>
Что я пытаюсь сделать, так это экспортировать время (в этом примере «17:40»), тип гонки (в этом примере «Бампер», расстояние («2 м 90 лет») и название («В списке»). Каждый скачки будут следовать той же схеме, что и выше, и я пробовал несколько способов, но пока не пошел Обычно (я полагаю) это можно было бы просто сделать с помощью селектора класса или css, но каждый диапазон связан с ahref, а css одинаков для каждая его часть. Я не уверен, можно ли просто выбрать конкретный диапазон в этом ahref, например, «span [0] = '17:40'» / «span [2] = 'Listed'» и т. д.? • Даже если это возможно, время ("17:40") находится внутри тега <b> внутри первого интервала вместе с типом ("Бампер").
Я хотел бы, чтобы вывод был (который будет сохранен в фрейме данных):
«Время: 17:40» «Тип гонки: бампер» «Расстояние: 2 м 90 лет» 'Название: Внесено в список'
И это повторяется для каждого li во всем списке.
Если возможно, мне также нужно взять URL-адрес и добавить корневой URL-адрес. Я пытался использовать urljoin, но мне это не нравится, так как он смешивает разные строки/списки и т.д.
Любая помощь будет большой спасибо.
Мой код до сих пор:
from bs4 import BeautifulSoup
from requests_html import HTMLSession
import pandas as pd
import requests
from urllib.parse import urljoin
HTMLFileToBeOpened = open("timeform.html", "r")
contents = HTMLFileToBeOpened.read()
beautifulSoupText = BeautifulSoup(contents, 'html.parser')
daily_racecard_info = beautifulSoupText.find(class_='w-racecard-grid-container widget-content widget-content-no-padding')
# Finds main body for INDIVIDUAL racecards
individual_course_racecard = daily_racecard_info.find_all(class_='w-racecard-grid-meeting')
# Finds course names for all
course_names = [item.find(class_='w-racecard-grid-course clickable').text.strip() for item in individual_course_racecard]
# Finds going for all courses
course_going = [item.find(class_='w-racecard-grid-info w-racecard-grid-info-going').text.strip() for item in individual_course_racecard]
# Removes word "going" from going
goings_simple = [item.replace('Going', '') for item in course_going]
# Gets individual race data (title, link, time, flat / hurdle / chase etc, distance and type)
individual_race_info = [item.find_all('li', class_='w-racecard-grid-race-result') for item in individual_course_racecard]






Чтобы извлечь необходимую информацию из HTML с помощью Beautiful Soup, вы можете использовать метод «find», чтобы найти тег «a» внутри каждого тега «li», а затем использовать атрибут содержимого для доступа к элементам span внутри тега a.
Вот пример кода, который должен делать то, что вам нужно:
from bs4 import BeautifulSoup
import requests
import pandas as pd
from urllib.parse import urljoin
# Example URL to scrape
url = "https://example.com/horse-racing"
# Get the page content and create a BeautifulSoup object
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
# Find all the race result li elements
race_results = soup.find_all("li", class_ = "w-racecard-grid-race-result")
# Create an empty list to store the data
data = []
# Loop over each race result
for result in race_results:
# Find the a tag within the li
a_tag = result.find("a")
# Extract the time and race type from the first span
time, race_type = a_tag.contents[0].text.split()
# Extract the distance from the second span
distance = a_tag.contents[1].text
# Extract the title from the third span
title = a_tag.contents[2].text
# Construct the full URL using urljoin
full_url = urljoin(url, a_tag["href"])
# Add the data to the list
data.append({
"Time": time,
"Race Type": race_type,
"Distance": distance,
"Title": title,
"URL": full_url
})
# Convert the list of dicts to a pandas DataFrame
df = pd.DataFrame(data)
# Print the DataFrame
print(df)
Функция urljoin используется для создания полного URL-адреса для каждого результата гонки на основе корневого URL-адреса страницы.
Просто хотел вернуться и сказать большое спасибо, это действительно работает, но некоторые коды требуют отступов. Огромное спасибо.
Кажется, вы можете найти все
<li class = "w-racecard-grid-race-result"элементы, а затем найти все<span>дочерние элементы каждого<li>.