Сильные экземпляры в Divs - только захват первоначального экземпляра - PullRequest
0 голосов
/ 21 сентября 2019

У меня небольшая проблема с моим кодом.По сути, я стремлюсь извлечь из некоторого кода следующие экземпляры:

<td>
<div>
<div>8 of 15 — <strong>53%</strong></div>
<div><div style="width: 100%"><div style="width: 53%"></div></div>
</div>
</div>
</td>

Я пытаюсь собрать данные в div до сильного и сильного процента.В настоящее время работаю со следующими данными, чтобы получить эти данные, но я могу получить только a) первый экземпляр или b) нулевые значения:

from bs4 import BeautifulSoup as bsoup
import requests as reqs

other_stat_list = []

page_to_parse = 'https://fbref.com/en/matches/033092ef/Northampton-Town-Lincoln-City-August-4-2018-League-Two'

page = reqs.get(page_to_parse)
status_code = page.status_code
status_code = str(status_code)
parse_page = bsoup(page.content, 'html.parser')


find_other_stats = parse_page.find_all('div', id="team_stats")
for stat in find_other_stats:
    add_other_stats = stat.find_next('strong').get_text()
    other_stat_list.append(add_other_stats)
    print(add_other_stats)

У меня раньше была похожая проблема, когда не все экземпляры divбыли захвачены в плен.Я запустил рекурсию, чтобы захватить всех детей в коде:

find_other_stats = parse_page.find_all('div', id="team_stats")
all_other_stats = find_other_stats[0].find_all('div', recursive=False)
for stat in all_other_stats:
    add_other_stats = find_next('strong').get_text()
     other_stat_list.append(add_team)

Однако вариант этого также дает нули, поэтому не уверен, почему рекурсия не работает.

Ожидаетсяполучите '53% 'и в идеале' 8 из 15 -.Я могу разобрать сами значения, но захват их выглядит сложнее, чем я ожидал.Спасибо за помощь!

1 Ответ

1 голос
/ 21 сентября 2019

Используя этот код, я получаю все детали как отдельные элементы.

Во-первых: есть только один 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%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...