Очистка элементов внутри списка в BeautifulSoup

Я совершенно новичок в парсинге (и первый пост здесь), но с помощью 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]

Кажется, вы можете найти все <li class = "w-racecard-grid-race-result" элементы, а затем найти все <span> дочерние элементы каждого <li>.

John Gordon 08.04.2023 22:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы извлечь необходимую информацию из 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-адреса страницы.

Просто хотел вернуться и сказать большое спасибо, это действительно работает, но некоторые коды требуют отступов. Огромное спасибо.

Matthew Trickey-Trehearn 10.04.2023 16:21

Другие вопросы по теме