Используя этот код, я получаю все детали как отдельные элементы.
Во-первых: есть только один div
с id="team_stats"
, поэтому я использую find()
вместо find_all()
Вместо searchig div
я ищу td
и использую get_text()
Я получаю полный текст в ячейке.Таким образом, мне не нужна рекурсия для вложенного <div>
, и я не получаю пустую строку из пустого <div>
.
Получив весь текст из всех ячеек таблицы, я разбил его на более мелкие части и очистилих.
Я разделил его на —
, чтобы получить 53%
и 8 of 15
как отдельные элементы.Но —
не является нормальным -
, поэтому я вручную скопировал / вставил его из HTML в код.
Я обнаружил, что есть также символ с кодом '\xa0'
(который может быть "неразрывным пробелом" или чем-то подобным), и я очистил его с помощью strip('\xa0')
- я также мог бы использовать rstrip()
/ lstrip()
или replace()`` or slice it with
[1:] and
[: - 1] `.
from bs4 import BeautifulSoup as BS
import requests
url = 'https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two'
response = requests.get(url)
soup = BS(response.content, 'html.parser')
# --- getting data ---
data = []
stats = soup.find('div', id="team_stats")
for row in stats.find_all('td'):
text = row.get_text(strip=True)
data.append(text)
# --- splitting and cleaning data ---
print('Possession:', data[0], '|', data[1])
text1, percent1 = data[2].split('—')
percent2, text2 = data[3].split('—')
text1 = text1.strip('\xa0')
text2 = text2.strip('\xa0')
print('Shots on Target:', text1, '|', percent1, '|', text2, '|', percent2)
text1, percent1 = data[4].split('—')
percent2, text2 = data[5].split('—')
text1 = text1.strip('\xa0')
text2 = text2.strip('\xa0')
print('Saves:', text1, '|', percent1, '|', text2, '|', percent2)
Результат:
Possession: 58% | 42%
Shots on Target: 8 of 15 | 53% | 2 of 4 | 50%
Saves: 1 of 2 | 50% | 8 of 8 | 100%