Я пытаюсь получить некоторые данные с сайта киберспортивной статистики (vlr.gg). Я решил использовать BeatifulSoup, но сейчас столкнулся с некоторыми проблемами при очистке данных из одних и тех же имен классов.
box5=soup.find_all("div",class_ = "match-header-vs-score")
for p in box5:
matchtdetails=p.find("div",class_ = "match-header-vs-note").get_text(strip=True)
print(" In: ",matchtdetails)
box6=soup.find_all("div",class_ = "match-header-vs-note")
for q in box6:
if q.find("div",class_ = "match-header-vs-note"):
matchdetails1=q.find("div",class_ = "match-header-vs-note").get_text(strip=True)
print(matchdetails1)
Это конкретный блок HTML-кода, с которым я работаю:
<div class = "match-header-vs-score">
<div class = "match-header-vs-note">
<span class = "match-header-vs-note mod-upcoming">18h 24m
</span>
</div>
<div class = "match-header-vs-placeholder"> –
</div>
<div class = "match-header-vs-note">Bo3
</div>
</div>
Я новичок в очистке HTML, и, насколько я понял, для получения конкретных данных я должен указать «поле» на класс, немедленно обертывая классы нужных мне данных, а затем перебирать классы в цикле и « Найдите» конкретный класс, из которого мне нужны данные.
Box5 используется для получения статистики оставшегося времени, box6 — для ее формата (bo1, bo3 и т. д.).
Однако в этом коде box6 мне ничего не возвращает.
Что касается box5, я изначально пытался использовать find_all() для «match-header-vs-note», так как это был непосредственный класс, который обертывал «предстоящий мод match-header-vs-note», но он продолжал выдавать мне NoneType Attribute Error. Я думал, что проблема заключается в пробеле, обозначающем несколько классов внутри, но нет, аналогичные классы с пробелами в имени работали и в других местах. После того, как я изменил код для box5 на код, который я дал выше, он работает.
Первоначально мой мыслительный процесс заключался в использовании find_all() внутри цикла и сохранении данных в списке, но, как я узнал, это выдает следующую ошибку:
AttributeError: 'NavigableString' object has no attribute 'find_all'. Did you mean: '_find_all'?






Вы близки к решению и уже сделали правильный выбор, но другого <div> с соответствующим классом внутри box6 вы не найдете, потому что вы уже позиционировали себя на этом элементе.
Постарайтесь упростить свой подход и использовать информацию ResultSet как есть:
box5,box6 = [e.get_text(strip=True) for e in soup.find_all("div",class_ = "match-header-vs-note")]
Или выберите родительский элемент и поработайте над его текстовым содержимым:
box5,box6 = soup.find("div",class_ = "match-header-vs-score").get_text(strip=True).split('–')
import requests
from bs4 import BeautifulSoup
soup = BeautifulSoup(requests.get('https://www.vlr.gg/326896/leviat-n-gc-vs-firepower-game-changers-2024-latam-south-opening-w5').text)
box5,box6 = [e.get_text(strip=True) for e in soup.find_all("div",class_ = "match-header-vs-note")]
Это было бы предназначено для задания нового вопроса именно с этим фокусом, чтобы сохранить ОП в чистоте. Однако в случае избежания box5 просто разрежьте свой ResultSet и выберите последний элемент. soup.find_all("div",class_ = "match-header-vs-note")[-1].
Я не знал, что он так себя ведет, большое спасибо. Итак,
box6просто перешел к следующему экземпляру, имя класса было найдено, аbox5остается в первом экземпляре, если я правильно понимаю. Однако что, если я хочу избежать перехвата первого экземпляра (т. е.box5) и сразу перейти ко второму экземпляру, используя только один ящик?