Есть ли способ очистить идентификатор div в bs4?

#python #beautifulsoup

#python #beautifulsoup

Вопрос:

Существует несколько классов div, которые имеют одно и то же имя класса, но другой идентификатор:

<div class ="starting-lineups__matchup" data-gamepk="******">

Я могу очистить нужные мне данные в этих классах, но мне постоянно приходится проверять страницу, чтобы узнать значение для data-gamepk. Есть ли способ очистить это число?

Вот сайт, который я очищаю, и мой код ниже:

https://www.mlb.com/starting-lineups

 #main table that contains the data
gamelist = soup.find('div',attrs={'class':'starting-lineups__container-multi'})

user = input()

#game specific data
game = gamelist.find('div',attrs={'data-gamepk':user})

#loop through away team name
for teams in game.find_all('span',attrs={'class':'starting-lineups__team-name--away'}):
    for team_a in teams.find_all("a"):
        print(team_a.text)
  

Итак, все названные классы 'starting-lineups__matchup' находятся внутри 'starting-lineups__container-multi класса’. У всех 'starting-lineups__matchup' классов есть номер, связанный с ними. Пользователь вручную вводит этот номер, чтобы очистить данные в этом конкретном классе. Который в приведенном выше коде был бы просто названием команды гостей starting-lineups__team-name--away .

Чтобы найти номер для каждой игры, я просматривал веб-страницу. Вместо того, чтобы посещать веб-сайт и самостоятельно просматривать html, я хочу очистить этот номер, а также связанные с ним названия команд.

Комментарии:

1. Вы хотели бы опубликовать URL? или какой-то код?

2. Пожалуйста, добавьте полный фрагмент HTML-кода и данные, которые вы пытаетесь извлечь.

3. как только вы получите элемент, вы можете получить атрибут. Так, например, что-то вроде: soup.find('div',{'class':'starting-lineups__matchup'})['data-gamepk']

4. Я только что отредактировал пост, надеюсь, это внесет некоторую ясность.

Ответ №1:

Надеюсь, я правильно понял ваш вопрос: этот скрипт напечатает номер игры и названия команд дома / на выезде:

 import requests
from bs4 import BeautifulSoup


url = 'https://www.mlb.com/starting-lineups'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

for game in soup.select('[data-gamepk]'):
    print(game['data-gamepk'])
    print(game.select_one('.starting-lineups__team-name--away').get_text(strip=True))
    print(game.select_one('.starting-lineups__team-name--home').get_text(strip=True))
    print('-' * 80)
  

С принтами:

 631112
Cubs
Pirates
--------------------------------------------------------------------------------
631432
Rangers
Astros
--------------------------------------------------------------------------------
631146
Nationals
Phillies
--------------------------------------------------------------------------------
631234
Yankees
Mets
--------------------------------------------------------------------------------
631368
Padres
Angels
--------------------------------------------------------------------------------
631614
Blue Jays
Red Sox
--------------------------------------------------------------------------------
631405
White Sox
Royals
--------------------------------------------------------------------------------
631370
D-backs
Dodgers
--------------------------------------------------------------------------------
631055
Athletics
Mariners
--------------------------------------------------------------------------------
  

Ответ №2:

Возможно, вы сможете использовать это:

 from bs4 import BeautifulSoup import re

soup= BeautifulSoup(html.text,'lxml') 
results = soup.findAll("div", {"data-gamepk" : re.compile(r".*")})
  

Здесь будет указан каждый div с атрибутом «data-gamepk».

PS: использование True вместо re.compile(r».*») также может сработать.