Как получить более одного предмета с одинаковым тегом html на BeautifulSoup - PullRequest
0 голосов
/ 15 января 2020

Я новичок в BeautifulSoup, и я не настолько знаком с Html .. Но я учусь и нахожу для себя несколько небольших проектов, которые нужно сделать. Для этого я хочу получить информацию о футбольном матче с этого сайта , например TeamA Дата / время TeamB.

Вот мой код

import requests
from bs4 import BeautifulSoup

url = 'https://www.lequipe.fr/Football/ligue-1/page-calendrier-resultats/21e-journee'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

all_result = soup.find('div', class_="grid")

all_pairs = all_result.find_all('div', class_='grid__item')

i = 0
for result in all_pairs:
    i = i + 1
    team_name = result.find('span', class_='TeamScore__nameshort')  
    calendrier = result.find('div', class_='TeamScore__data')

    
    
    print(i)
    print(team_name.text.strip())
    print(calendrier.text.strip())
    print()

Мои проблемы:

  1. Он захватывает только первую команду. Как Ницца против Ренна, но это только "Ницца". Теги Html для TeamA и TeamB кажутся мне одинаковыми. Я проверил find_all, но он тоже не сработал.

  2. По какой-то причине получаемые дата / время неверны. Он показывает несколько совершенно разных дат и времени. Я не знаю почему ..

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

find_all действительно функция, которую вы ищете.

Попробуйте:

import requests
from bs4 import BeautifulSoup

url = 'https://www.lequipe.fr/Football/ligue-1/page-calendrier-resultats/21e-journee'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

all_result = soup.find('div', class_="grid")

all_pairs = all_result.find_all('div', class_='grid__item')

i = 0
for result in all_pairs:
    i = i + 1
    team_names = result.find_all('span', class_='TeamScore__nameshort')
    first_team_name = team_names[0]
    second_team_name =  team_names[1]
    calendrier = result.find('div', class_='TeamScore__data')



    print(i)
    print('{} vs {}'.format(first_team_name.text.strip(), second_team_name.text.strip()))
    print(calendrier.text.strip())
    print()

, которая должна выдать:

1
Nice vs Rennes
24 janv.
                    20h45

2
Marseille vs Angers
25 janv.
                    17h30

3
Montpellier vs Dijon
25 janv.
                    20h00

4
Monaco vs Strasbourg
25 janv.
                    20h00

5
Reims vs Metz
25 janv.
                    20h00

6
Brest vs Amiens
25 janv.
                    20h00

7
Saint-Étienne vs Nîmes
25 janv.
                    20h00

8
Lyon vs Toulouse
26 janv.
                    15h00

9
Nantes vs Bordeaux
26 janv.
                    17h00

10
Lille vs Paris-SG
26 janv.
                    21h00

find_all просто возвращает список элементов, поэтому вам нужно будет использовать индекс для доступа к нужному элементу (или, альтернативно, выполнить итерацию по списку).

Что касается разных дат, я не рассматривал их, кроме одного причина может заключаться в том, что при посещении сайта в браузере даты меняются на JS, чтобы соответствовать местному часовому поясу. Получив сайт с BeautifulSoup, вы получите даты часового пояса по умолчанию.

0 голосов
/ 15 января 2020

Вы можете использовать

element = soup.select('div.grid__item')
firstElement = element[0].get_text()

Другой пример, чтобы получить атрибут для следующего html кода:

<div class="nextpage">
    <a class="next-story" href="somepage.html">Some Page</a>
    <a class="next-story" href="somepage2.html">Some Page 2</a>
    <a class="next-story" href="somepage3.html">Some Page 3</a>
</div>

Код будет:

link = soup.select('div.nextpage a.next-story')
href = link[0].get('href')

Когда вы печатаете href, он возвращает 'somepage. html'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...